Listy odtwarzania wideo z godziną rozpoczęcia i zakończenia


10

Czy istnieje dobra aplikacja GUI (na przykład GUI mplayer lub coś w rodzaju banshee) dla systemu Linux, która pozwala tworzyć i edytować listy odtwarzania (dla plików wideo) z różnymi czasami rozpoczęcia i zakończenia każdego filmu na liście?

Dodano :

W tej chwili tworzę ręcznie pliki, które zawierają coś takiego:

video.avi -ss 2440 -endpos 210
#some comment

video2.mp4 -ss 112 -endpos 2112

Następnie mam skrypt otoki dla: mplayer -fs $(grep -v "^ #" $1)

Ponadto napisałem kilka funkcji emacsa, które nieco upraszczają edycję takich plików. (Jak konwertowanie czasu początkowego i końcowego z formatu hh: mm: ss na sekundy, a czas końcowy na pozycję względną (czas końcowy - czas początkowy) zgodnie z wymaganiami -endpos (mogę wysłać makra, jeśli ktoś jest zainteresowany). Jednak to nadal jest zbyt niewygodne. Moje pytanie brzmi więc, czy jest do tego przyjemny GUI (na przykład, który pozwala oznaczyć na osi czasu wideo godziny rozpoczęcia i zakończenia listy odtwarzania itp.).


@ user5289: Jeśli interesują Cię tylko odpowiedzi na Ubuntu (nie wspomniałeś o dystrybucji w swoim pytaniu), możesz wybrać witrynę, o którą chcesz zapytać. Jeśli wolisz Ask Ubuntu, użyj flagprzycisku na swoim pytaniu i poproś o migrację.
Gilles „SO- przestań być zły”

1
@ user5289 Czy wszystko, czego chcesz ... aby móc odtwarzać wideo w GUI (ponieważ „mplayer” z pewnością nie jest GUI)? ... czy chcesz ustawić czas w GUI (także)? .. ponieważ możesz po prostu użyć Smplayera, aby użyć istniejących „komend czasowych” .. Napisałem skrypt, aby to zrobić .. Wyślę skrypt jako i odpowiem .. Ktoś może uznać go za interesujący .. Z pewnością uznałem twoją metodę za interesującą ... i właśnie dostosowałem ją do Smplayera ..
Peter.O

@ fred.bear, tak, chodzi o to, że chcę mieć możliwość ustawienia pozycji czasowych w GUI, edytowania całej listy odtwarzania w GUI w wygodny sposób. (Granie w GUI nie jest ważne)
uczeń

@ user5289: Możliwe jest ustawienie pozycji czasowych w GUI ... Robię to za pomocą Smplayera ... Dodałem nowy timestampsskrypt do mojej oryginalnej odpowiedzi, która pokazywała tylko play-it-in-Smplayerskrypt
Peter.O

Odpowiedzi:


3

Może źle rozumiem pytanie, ponieważ angielski nie jest moim pierwszym językiem, ale czy nie byłoby lepiej, gdybyś edytował wideo za pomocą narzędzia takiego jak Kino zamiast tworzyć taką listę odtwarzania?

Możesz dostosować czas rozpoczęcia i zakończenia, jak chcesz, i nie sądzę, że byłoby to takie trudne.


2
Tak, wiem, jak wycinać filmy za pomocą Kino lub czegoś podobnego. Pytanie dotyczy naprawdę list odtwarzania, a nie tworzenia nowych filmów. Tworzenie takich list odtwarzania byłoby bardzo szybkie, elastyczne i nie wymagałoby dodatkowego miejsca na dysku.
student

3

AKTUALIZACJA-2: Po przesłaniu następującego skryptu przyszło mi do głowy, że innym sposobem ustawienia pozycji czasowych (w GUI) jest użycie edytora napisów (np. gnome-subtitles). Możesz po prostu kliknąć, aby zaznaczyć pozycję początkową i końcową „napisów fantomowych”; w rzeczywistości możesz wstawić ścieżkę do pliku i komentarze jako „podtytuł” ​​... Niektóre formaty nie są odpowiednie (np. używając numerów ramek) .. Wygląd „ViPlay Subtitle File”, Power DivX i „Adobe Encore DVD” dobrze.

AKTUALIZACJA-1; nowy skrypt ... Ten skrypt nie da ci zintegrowanej możliwości odtwarzania, ale pozwoli ci wybierać i zapisywać oraz modyfikować czas rozpoczęcia i zakończenia w Smplayer, bez potrzeby wpisywania czegokolwiek.

Informacje te są zapisywane w pliku konfiguracyjnym, którego ścieżki plików można „odtwarzać” indywidualnie lub pogrupować w sekwencji za pomocą innego skryptu (podobnego do mojego skryptu „play” lub podobnie jak skrypty Emacsa).

Działa przy użyciu Seekokna dialogowego Smplayera ... xmacromanipuluje oknem (odkryłem, że potrzebuje sleep .3między poleceniami xmacro) ... Czasy są przechowywane w formacie HH: MM: SS w pliku w ~/.config/smplayer... Pierwsza linia to Czas rozpoczęcia, drugi wiersz to Czas końcowy, a trzeci wiersz służy do określenia katalogu głównego ... Ten trzeci wiersz jest używany jako opcjonalny wskaźnik ścieżki przez skrypt śledzenia, który modyfikuje ustawienie konfiguracji smplayer przez wypełnianie go przy pomocy -ssi -endpos... Plik konfiguracyjny znaczników czasu ma taką samą nazwę jak plik multimedialny, z .smplayprzyrostkiem ...

Więc to nie wszystko, czego chcesz, ale może pomóc ustawić godziny bez pisania ...

Oto skrypt „pobierz znaczniki czasu”:

#!/bin/bash
# Bind this script to a key-combination of your choice..
# It currently responds only to an Smplayer window.  

id=$(xdotool getactivewindow)
title="$(xwininfo -id "$id" |
  sed -n "2s/^xwininfo: Window id: \(0x[[:xdigit:]]\+\) \x22\(.*\)\x22$/\2/p")"

if [[ $title =~ ^.*\ -\ SMPlayer$ ]] ; then
  smplayer_d="$HOME/.config/smplayer"
  clip_d="$smplayer_d/clips"
  [[ ! -d "$clip_d" ]] && mkdir -p "$clip_d"
  bname="${title% - SMPlayer}"
  clip_f="$clip_d/$bname.smplay" # Same name as video, with '.smplay' suffix

  if [[ ! -f "$clip_f" \
      || "$(<"$clip_f" wc -l)" != "3" ]]
  then     # Prime with three defaults
           # FROM     TO      ROOT-dir
    echo -e "0:00:00\n0:00:00\n"     >"$clip_f"
  fi

  # Get timestamp, in seconds, of current stream position (from the current window)
  #   using the "Smplayer - seek" dialog, via  Ctrl+j
  sleep .3; echo -n "KeyStrPress Control_L  KeyStrPress j       KeyStrRelease j       KeyStrRelease Control_L" | xmacroplay -d 10 :0.0 &>/dev/null 
  sleep .3; echo -n "                       KeyStrPress Home    KeyStrRelease Home                           " | xmacroplay -d 10 :0.0 &>/dev/null 
  sleep .3; echo -n "KeyStrPress Shift_L    KeyStrPress End     KeyStrRelease End     KeyStrRelease Shift_L  " | xmacroplay -d 10 :0.0 &>/dev/null 
  sleep .3; echo -n "KeyStrPress Control_L  KeyStrPress c       KeyStrRelease c       KeyStrRelease Control_L" | xmacroplay -d 10 :0.0 &>/dev/null
  sleep .3; echo -n "                       KeyStrPress Escape  KeyStrRelease Escape                         " | xmacroplay -d 10 :0.0 &>/dev/null 
    seekHMS="$(xsel -o -b)"
  # Now set config times to defaults (in case of malformed times)
      ssHMS="0:00:00"
  endposHMS="0:00:00"
  # Now get config data from config file
  eval "$( sed -ne "1s/^\([0-9]\+\):\([0-5][0-9]\):\([0-5][0-9]\)$/    ssHMS=\"&\"/p" \
                -e "2s/^\([0-9]\+\):\([0-5][0-9]\):\([0-5][0-9]\)$/endposHMS=\"&\"/p" \
                -e "3s/.*/   root_d=\"&\"/p" "$clip_f" )"

  # Present dialog to set specifick  items.
  REPLY=$(zenity \
   --list --height=310 --width=375 \
   --title="Set Clip Start / End Time" \
   --text=" Select Clip Start / End  for time:  $seekHMS\n\
       or choose another option\n\
       \tthen click OK" \
   --column="Position" --column=" " --column="Current Setting  "  \
            "Clip Start"        " "          "$ssHMS" \
            "Clip End"          " "          "$endposHMS" \
            "UNSET Start"       " "          " " \
            "UNSET End"         " "          " " \
            "* Open directory"  " of"        "config files *" 
  ); 
  [[ "$REPLY" == "Clip Start"       ]] && sed -i -e "1 s/.*/$seekHMS/" "$clip_f"
  [[ "$REPLY" == "Clip End"         ]] && sed -i -e "2 s/.*/$seekHMS/" "$clip_f"
  [[ "$REPLY" == "UNSET Start"      ]] && sed -i -e "1 s/.*/0:00:00/"  "$clip_f"
  [[ "$REPLY" == "UNSET End"        ]] && sed -i -e "2 s/.*/0:00:00/"  "$clip_f"
  [[ "$REPLY" == "* Open directory" ]] && nautilus "$clip_d"
fi  

Poniższy skrypt jest moim oryginalnym fragmentem „play”. Jest niezależny od skryptu Avove Timestamp, ale nie wymagałoby wiele, aby je ze sobą współpracować ...

Będzie „napędzał” Smplayera, który korzysta z mplayera wewnętrznie .. jest to przynajmniej normalny GUI, ale twoja lista odtwarzania musiałaby być w edytorze tekstów… i oczywiście już wiesz o tej metodzie :)

Próbowałem tego kilka lat temu, ale zapomniałem o tym, ponieważ często nie potrzebuję czegoś takiego, ale dobrze jest zachować „zakładki”. Cieszę się, że wskrzesiłeś ten pomysł. Oto skrypt ... który naprawdę robi to samo co ty, ale Smplayer (GUI mplayer)

#
# Summary: 
#   Play one video (only) in 'smplayer', passing -ss and -endpos values to 'mplayer'
#   It uses 'locate' to get the path of the video (by just its basename)
#
# eg:
#     $1                              $2   $3       $4 
#     basename                       -ss  -endpos   root 
#     "Titus - The Gorilla King.mp4"  240  30      "$HOME"  # A fascinating documentary of the long reign of a silver-back gorialla
#

[[ "$2" == "" ]] && set "$1"  0   "$3"   "$4"
[[ "$3" == "" ]] && set "$1" "$2"  36000 "$4"  # 36000 is arbitary (24 hours) 
[[ "$4" == "" ]] && root="$HOME" || root="$4"

file=( "$(locate -er "^$root/\(.*/\)*\+$1$")" )

# 1) Tweak 'smplayer.ini' to run 'mplayer' with the specified -ss and -endpos  times
# 2) Run 'smplayer' to play one video only. The time settings will hold afer exit,  
#                         so the script waits (backgrounded) for smplayer to exit
# 3) When 'smplayer' exits, set values to extreme limits:  -ss 0 -endpos 3600 
#                           or(?): TODO remove the settings enitrely, 
#                                       but that requires a different regex
a=0 z=36000     
# 
# -ss <time> (also see -sb)
# -ss 56       # Seeks to 56 seconds.
# -ss 01:10:00 #Seeks to 1 hour 10 min.
#
# -endpos <[[hh:]mm:]ss[.ms]|size[b|kb|mb]> (also see -ss and -sb)
#         Stop at given time or byte position.
#         NOTE: Byte position is enabled only for MEncoder and will not be accurate, as it can only stop at a frame boundary.  
#         When used in conjunction  with -ss option, -endpos time will shift forward by seconds specified with -ss.
#        -endpos 56        # Stop at 56 seconds.
#        -endpos 01:10:00  # Stop at 1 hour 10 minutes.
# -ss 10 -endpos 56        # Stop at 1 minute 6 seconds.
#        -endpos 100mb     # Encode only 100 MB.
#
#                                                        -ss       0                -endpos       36000                                     
#              \1                              \2      \3        \4        \5     \6            \7            \8                 
 sed -i -e "s/^\(mplayer_additional_options.*\)\( \|=\)\(-ss \+\)\([^ ]\+\)\( .*\)\(-endpos \+\)\([0-9:mb]\+\)\(.*\)/\1\2\3${2}\5\6${3}\8/"  $HOME/.config/smplayer/smplayer.ini
(smplayer "$file" 
 sed -i -e "s/^\(mplayer_additional_options.*\)\( \|=\)\(-ss \+\)\([^ ]\+\)\( .*\)\(-endpos \+\)\([0-9:mb]\+\)\(.*\)/\1\2\3${a}\5\6${z}\8/"  $HOME/.config/smplayer/smplayer.ini
)
exit

Dziękuję za aktualizację. Czy możesz dodać instrukcję krok po kroku, jak korzystać ze skryptu?
student

@ user5289. Powinno to wymagać tylko, aby mieć otwarty program smplayer z filmem, a skrypt jest powiązany z klawiszem skrótu (używam klawiszy xbindkeys, ale wszystko się da). Następnie możesz w dowolnym momencie filmu po prostu nacisnąć skrót -key .. Ponieważ wykorzystuje makro niezwiązane z smplayerem, nie powinieneś nic robić (kliknięcie klawiaturą lub myszą), dopóki nie pojawi się drugie okno dialogowe. Potrzebuje 1-2 sekund, aby sprawdzić „Czy to jest właściwe okno?” I otworzyć „okno wyszukiwania” smplayera, z którego makro kopiuje bieżącą pozycję czasową przedstawioną w GG: MM: SS .. Nie przerywaj tego okna dialogowego. ...
Peter.O

ciąg dalszy ... Makro skopiuje znacznik czasu do schowka, a następnie zamknie „okno wyszukiwania”. Następnie pojawi się drugie okno dialogowe (okno „zenity”) ... Poprosi cię o wykonanie 1 z 5 rzeczy. 1) użyj przechwyconego znacznika czasu jako pozycji początkowej. 2) użyj przechwyconego znacznika czasu jako pozycji końcowej. 3) Unset Start Positon. 4) Pozycjonowanie końca pozycyjnego. 5) Otwórz nautilus w katalogu, w którym znajduje się zapisany plik „config”. Pliki konfiguracyjne są nazwane identycznie jak wideo. (nazwa pochodzi z paska tytułu Smplayera) ..
Peter.O

ciąg dalszy ... Stamtąd możesz wykorzystywać czasy, jakie chcesz w swoich obecnych skryptach ... Pracuję nad skryptem, który integruje się ze Smplayerem; Mój pierwszy skrypt smplayer (pokazany w mojej oryginalnej odpowiedzi) jest nieco naiwny i wywołuje pewne awarie. Smplayer ma opcję przechowywania historii każdego odtwarzanego pliku. Można to zrobić w jednym pliku lub w pojedynczych plikach ... Metoda indywidualnego pliku (domyślnie, jak sądzę (?), Jest najbardziej odpowiednia, ale nazwy .ini są zakodowane. Aktualnie pracuję nad naśladowaniem, które ma algorytm ... więc
bądź na

ciąg dalszy ... Będziesz musiał zainstalować te aplikacje ... xdotool xwininfo xmacro zenity sed(ale kto nie ma sed :) i oczywiście smplayer... Jak już wspomniałem, moja odpowiedź .. to tylko „asysta”… jak dotąd , ale myśląc o tym teraz, kiedy to piszę, można go przeszczepić na normalną listę odtwarzania smplayer! ponieważ lista odtwarzania będzie odtwarzana zgodnie z zapisanymi plikami .ini smplayer (tymi z zaszyfrowanymi nazwami plików) .. Wygląda to lepiej i lepiej .. ale naprawdę potrzebuję przerwy :) .. za dużo smplayer na kilka dni. Nadal muszę ukończyć ten algorytm mieszania
Peter.O

2

Dodałem tę drugą odpowiedź, ponieważ działa ona jak zwykła lista odtwarzania w SMPlayerze i lepiej tutaj dla przejrzystości ...

Pracowałem bezbłędnie za pośrednictwem listy odtwarzania ...

Ta metoda wymaga ponownej kompilacji SMPlayera i określonej metody nazewnictwa plików ... Tylko jedna funkcja w źródle SMPlayera jest modyfikowana, a 3 nagłówki są dodawane do tego samego pojedynczego pliku źródłowego ... Skompilowałem smplayer_0.6.8dla Lucid .. Maveric i Meerkat używają smplayer_0.6.9.. Jedna linia w późniejszej wersji jest inna, ale to niczego nie denerwuje ... Oto zmodyfikowana funkcja i nagłówkismplayer_0.6.8

tak przy okazji, okno zenity w mojej poprzedniej odpowiedzi wciąż jest przydatne do rejestrowania czasów rozpoczęcia i zakończenia ...

PRZYPOMNIENIE - Następujące segmenty źródłowe są dla smplayer_0.6.8... Plik do modyfikacji to: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... Nowe segmenty są takie same dla '0.6.8' i '0.6.9', ale oryginały różnią się o jedną linię (bardzo blisko do koniec; tuż przed finałem return hexhash;)


Dodaj ten pierwszy blok linii bezpośrednio pod istniejącymi #includenagłówkami

// ====================
// fred mod begin block  
#include <QFileInfo>
#include <QRegExp>
#include <QSettings>
#include "paths.h"
// fred mod end block
// ==================

Oto zmodyfikowana funkcja

QString OSParser::calculateHash(QString filename) {
    QFile file(filename);

    if (!file.exists()) {
        qWarning("OSParser:calculateHash: error hashing file. File doesn't exist.");
        return QString();
    }

    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    in.setByteOrder(QDataStream::LittleEndian);
    quint64 size=file.size ();
    quint64 hash=size; 
    quint64 a;
    for(int i = 0; i < 8192; i++) {
        in >> a ; hash += a;
    };
    file.seek(size-65536);
    for(int i = 0; i < 8192; i++) {
        in >> a ; hash += a;
    };

  // =====================================================================
  // fred mod begin block
  //  
  // A mod to enable unique smplayer .ini files to be created for  
  //        content-identical media files whose file-names match
  //        a specific pattern based on two timestamps. 
  //        This is the naming pattern:

  //          
  //           name.[00:11:22].[33.44.55].mkv
  //              
  //        The two time stamps indicate the start and end  points of a 
  //         clip to be played according to  settings in the unique .ini
  //            
  //        The so named files can be, and typically will be, soft (or hard) links.   
  //        The "original" file can also named in this manner, if you like,    
  //        but that would make the "original" start playing as a clip,
  //          NOTE: soft links become invalid when you rename the original file.  
  //
  //  Note: For this system to work, you need to enable the following:
  //        In SMPlayer's GUI, open the Options dialog...
  //        In the  "General" tab... "Media settings"... 
  //          enable: 〼 "Remember settings for all files (audio track, subtitles...)" 
  //                     "Remember time position"   can be 'on' or 'off'; it is optional1
  //                                                but it is disabled for these clips.    
  //                     "Store setings in" must be: "multiple ini files" 
  //
  QFileInfo fi(filename);
  QString name = fi.fileName();
  //
  // ===================================================================
  // This RegExp expects a name-part, 
  //             followed by 2 .[timestamps]  (Begin-time and End-time)
  //             followed by a .extension
  //              
  //              .[ Begin  ].[  End   ]  
  //      eg. name.[00:11:22].[33.44.55].mkv
  //
  //    Note: The delimiter between each numeric value can be any non-numeric character.
  //          The leading dot '.' and square brackets '[]' must be as shown        
  //          HH, MM, and SS must each be 2 valid time-digits    
  //
  QRegExp rx("^.+"                      // NAME
             "\\.\\[([0-9][0-9])[^0-9]" // .[HH.
                   "([0-5][0-9])[^0-9]" //   mm.
                   "([0-5][0-9])\\]"    //   ss]
             "\\.\\[([0-9][0-9])[^0-9]" // .[HH.
                   "([0-5][0-9])[^0-9]" //   mm.
                   "([0-5][0-9])\\]"    //   ss]
             "\\.([^0-9]+)$");          // .EXTN
  //
  QString qstrIni;
  rx.setPatternSyntax(QRegExp::RegExp);
  if(rx.exactMatch(name)) {
      bool ok;
      QString qstrDlm(".");
      QString qstrBegEnd = rx.cap(1) + rx.cap(2) + rx.cap(3)
                         + rx.cap(4) + rx.cap(5) + rx.cap(6);
      hash += qstrBegEnd.toLongLong(&ok,10); // The UNIQUE-FIER
      //
      quint32 quiBegSec=(rx.cap(1).toULong(&ok,10)*3600)
                       +(rx.cap(2).toULong(&ok,10)*  60)
                       +(rx.cap(3).toULong(&ok,10));
      quint32 quiEndSec=(rx.cap(4).toULong(&ok,10)*3600)
                       +(rx.cap(5).toULong(&ok,10)*  60)
                       +(rx.cap(6).toULong(&ok,10));
      quint32 quiDifSec=(quiEndSec-quiBegSec);
      // 
      QString qstrBegIni = "-ss "     + QString::number(quiBegSec);
      QString qstrEndIni = "-endpos " + QString::number(quiDifSec);
              qstrIni    = qstrBegIni + " " + qstrEndIni;
  }
  // fred mod end block
  // =====================================================================
  // fred NOTE: the following 2 lines are a single line in smplayer-0.6.9

    QString hexhash("");
    hexhash.setNum(hash,16);

  // =====================================================================
  // fred mod begin block  
    if( !qstrIni.isEmpty() ) {
      // ** The next code line is not ideal, but should be okay so long 
      //    as SMPlayer's options are set to use Multiple .ini files.  
      //       The literal "file_settings" is HARDCODED, as It wasnt' straight
      //       forward to get the value, The rest of the path was easily available 
      //       without any significant mods, which "file_settings" would require.    
      // TODO: Check for Multiple .ini Option being enabled.
      //  
      QString  dir_settings = Paths::configPath() + "/file_settings";
      QString fqfn_settings = dir_settings + "/" + hexhash[0] + "/" + hexhash + ".ini";

      QSettings set(fqfn_settings, QSettings::IniFormat);
      set.beginGroup("file_settings");
      set.setValue(  "starting_time", "0" );
      set.setValue(  "mplayer_additional_options", qstrIni );
    }
  // fred mod end block
  // =====================================================================

    return hexhash;
}

1

Nie udało mi się ustalić, czy naprawdę można je zastosować do list odtwarzania, ale możesz zajrzeć do Edycji list decyzyjnych (EDL). Oto kilka linków, które pomogą Ci zacząć:

  1. Podręcznik MPlayera na temat obsługi EDL

  2. Samouczek MPlayer EDL

  3. Edycja wideo z wiersza poleceń artykułu LinuxGazette

  4. Rozsądny projekt kinowy

Jeśli nie przeszkadza ci małe przerwy między filmami, możesz po prostu uruchomić mplayer kilka razy ze skryptu z różnymi plikami EDL za każdym razem. Jeśli przerwy są nie-nie, może powinieneś utworzyć nowy film, tak jak sugerował varrtto.


Dzięki jednak, korzystając z wiersza poleceń, myślę, że lepszym rozwiązaniem jest użycie mplayers -ss i -endpos + moje makra emacs (zobacz moje dodatki do oryginalnego postu). To, czego naprawdę chcę, to ładny interfejs GUI.
student
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.