Playlist video con orari di inizio e fine


10

Esiste una buona applicazione GUI (ad esempio una GUI di mplayer o qualcosa di simile a banshee) per Linux che consente di creare e modificare playlist (per file video) con tempi di avvio e di arresto diversi per ciascun video nell'elenco?

Aggiunto :

Al momento creo manualmente file che contengono qualcosa del genere:

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

video2.mp4 -ss 112 -endpos 2112

Quindi ho uno script wrapper per: mplayer -fs $(grep -v "^ #" $1)

Inoltre ho scritto alcune funzioni di emacs che semplificano un po 'la modifica di tali file. (Come convertire l'ora di inizio e di fine da hh: mm: ss in secondi e endtime in posizione relativa (endtime - starttime) come richiesto da -endpos (posso pubblicare le macro se qualcuno è interessato). Tuttavia, è ancora troppo scomodo. Quindi la mia domanda è se esiste una buona interfaccia grafica per farlo (ad esempio, che consente di contrassegnare in una sequenza temporale video gli orari di inizio e fine della playlist e così via).


@ user5289: se sei interessato solo alle risposte per Ubuntu (non hai menzionato una distribuzione nella tua domanda), puoi scegliere su quale sito chiedere. Se preferisci Chiedi Ubuntu, usa il flagpulsante sulla tua domanda e richiedi la migrazione.
Gilles 'SO-smetti di essere malvagio' l'

1
@ user5289 È tutto ciò che vuoi .. per poter riprodurre il video in una GUI (perché "mplayer" non è certamente una GUI)? ... o vuoi essere in grado di impostare le posizioni temporali in una GUI (anche)? .. perché puoi semplicemente usare Smplayer per usare i tuoi "comandi a tempo" esistenti .. Ho scritto uno script per fare proprio questo .. Pubblicherò lo script come e risponderò .. qualcuno potrebbe trovarlo interessante .. Certamente ho trovato interessante il tuo metodo .. e l'ho appena adattato a Smplayer ..
Peter

@ fred.bear, sì, il punto è che voglio essere in grado di impostare le posizioni temporali in una GUI, modificare l'intera playlist in una GUI in modo comodo. (Giocare in una GUI non è importante)
studente

@ user5289: È possibile impostare le posizioni temporali in una GUI ... Lo faccio con Smplayer .... Ho aggiunto il nuovo timestampsscript alla mia risposta originale che mostrava solo uno play-it-in-Smplayerscript
Peter.O

Risposte:


3

Forse sto sbagliando la domanda, dato che l'inglese non è la mia prima lingua, ma non sarebbe meglio se modificassi il video con uno strumento come Kino invece di creare una playlist come quella?

Puoi regolare i tempi di inizio e di fine come vuoi, e non penso che sarebbe così difficile.


2
Sì, so come tagliare video usando Kino o qualcosa del genere. La domanda riguarda davvero le playlist, non la realizzazione di nuovi video. Realizzare tali playlist sarebbe molto veloce, flessibile e non consumerebbe spazio su disco aggiuntivo.
studente

3

UPDATE-2: Dopo aver inviato il seguente script, mi sono reso conto che un altro modo per impostare le posizioni temporali (in una GUI) è usare un editor di sottotitoli (ad es. gnome-subtitles). È sufficiente fare clic per contrassegnare le posizioni iniziale e finale dei "sottotitoli fantasma"; in realtà è possibile inserire il percorso del file e i commenti come "sottotitolo" ... Alcuni formati non sono adatti (ad es. utilizzando i numeri di fotogramma) .. "ViPlay Subtitle File", Power DivX e aspetto "Adobe Encore DVD" bene.

UPDATE-1; un nuovo script ... Questo script non ti darà la possibilità di creare playlist integrate, ma ti permetterà di selezionare e salvare e modificare gli orari di inizio e fine all'interno di Smplayer, senza la necessità di digitare nulla.

Queste informazioni vengono salvate in un file di configurazione, i cui percorsi file possono essere "riprodotti" singolarmente o raggruppati in una sequenza, tramite un altro script (simile al mio script "play" o come i tuoi script Emacs).

Funziona utilizzando la Seekfinestra di dialogo di Smlayer ... xmacromanipola la finestra di dialogo (ho scoperto che è necessario sleep .3tra i comandi di xmacro) ... I tempi sono memorizzati in formato HH: MM: SS in un file in ~/.config/smplayer... La prima riga è la Ora di inizio, la seconda riga è l'ora di fine e la terza riga è lì per specificare una directory radice ... Questa terza riga viene utilizzata come indicatore di percorso opzionale dallo script folow-up che modifica un'impostazione di configurazione di smplayer da innescandolo con -sse -endpos... Il file di configurazione dei timestamp è chiamato come il file multimediale, con un .smplaysuffisso ...

Quindi questo non è tutto quello che vuoi, ma può aiutare a impostare i tempi senza digitare ...

Ecco lo script 'get timestamps':

#!/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  

La seguente sceneggiatura è la mia sceneggiatura originale "play". È indipendente dalla sceneggiatura di Timestamp, ma non ci vorrebbe molto per farle lavorare insieme ...

'Guiderà' Smplayer, che utilizza mplayer internamente .. è, almeno, una normale GUI, ma la tua playlist dovrebbe essere nel tuo editor di testo .. e ovviamente conosci già quel metodo :)

Ci ho provato un paio d'anni fa, ma me ne ero completamente dimenticato perché spesso non avevo bisogno di una cosa del genere, ma è bene tenere dei "segnalibri" .. Sono contento che tu abbia ripreso l'idea. Ecco la sceneggiatura ... che fa davvero solo la stessa cosa che hai fatto, ma per Smplayer (una GUI di 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

Grazie per l'aggiornamento. Potresti aggiungere un'istruzione passo-passo su come usare lo script?
studente

@ user5289. Dovresti solo avere lo smplayer aperto con il tuo video e lo script è associato come tasto di scelta rapida (io uso xbindkeys, ma tutto lo farà) .. Puoi quindi, in qualsiasi momento del film, premere il tuo collegamento -key .. Poiché utilizza una macro non correlata a smplayer, non dovresti fare nulla (clic sulla tastiera o sul mouse) finché non viene visualizzata la seconda finestra di dialogo. Sono necessari 1-2 secondi per controllare "È questa la finestra giusta? Ecc." E aprire la "finestra di dialogo di ricerca" dello smlayer da cui la macro copia la posizione temporale corrente che è presentata in HH: MM: SS .. Non interrompere questa finestra di dialogo. ...
Peter

continua ... La macro copierà il timestamp sul clipoard e quindi chiuderà la "finestra di dialogo di ricerca". Apparirà una seconda finestra di dialogo (una finestra di dialogo "zenity") ... Ti chiederà di fare 1 di 5 cose. 1) utilizzare il timestamp acquisito come posizione iniziale. 2) utilizzare il timestamp acquisito come posizione finale. 3) Disinserire Positon avvio. 4) Unset End Positon. 5) Apri nautilus nella directory che contiene il file "config" salvato. I file di configurazione sono identici al video. (il nome è preso dalla barra del titolo di Smplayer) ..
Peter.O

continua ... Da lì puoi usare i tempi come preferisci nei tuoi script correnti ... Sto lavorando a uno script che si integra con Smplayer; Il mio primo copione di smplayer (mostrato nella mia risposta originale) è un po 'ingenuo, e scatta su alcune opzioni. Smplayer ha un'opzione per tenere una cronologia di ogni file mai riprodotto. Questo può essere fatto in un singolo file o in singoli file ... Il metodo del singolo file (il valore predefinito, credo (?), È il più adatto, ma i nomi .ini sono sottoposti a hash. Attualmente sto lavorando per simulare che ha algoritmo ... quindi rimanete sintonizzati :)
Peter.O

continua ... Avrai bisogno di queste app installate .. xdotool xwininfo xmacro zenity sed(ma chi non ha sed :), e ovviamente smplayer... Come ho già detto la mia risposta .. è solo un "asssist" .. finora , ma a pensarci adesso, mentre scrivo, può essere fatto per innestarsi nella normale playlist di smplayer! perché la playlist verrà riprodotta in conformità con i file .ini di smplayer di salvataggio (quelli con i nomi dei file con hash) .. Questo sembra migliore e migliore .. ma ho seriamente bisogno di una pausa :) .. troppo smplayer per alcuni giorni. Devo ancora finire quell'algoritmo di hashing
Peter

2

Ho aggiunto questa seconda risposta, perché funziona come una normale playlist in SMPlayer, ed è meglio qui per chiarezza ...

L'ho fatto funzionare alla perfezione tramite la playlist ...

Questo metodo richiede una ricompilazione di SMPlayer e uno specifico metodo di denominazione dei file ... Viene modificata solo una funzione nel sorgente di SMPlayer e 3 intestazioni vengono aggiunte allo stesso singolo file di origine ... Ho compilato smplayer_0.6.8per Lucid .. Maveric e Meerkat usano smplayer_0.6.9.. Una riga nella versione successiva è diversa, ma ciò non disturba nulla ... Ecco la funzione modificata e le intestazioni persmplayer_0.6.8

tra l'altro, la finestra di dialogo zenity nella mia risposta precedente è ancora utile per catturare i tempi di inizio e fine ...

RICORDO - I seguenti segmenti di origine sono per smplayer_0.6.8... Il file da modificare è: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... I nuovi segmenti sono gli stessi per "0.6.8" e "0.6.9", ma gli originali differiscono di una riga (molto vicino a la fine; poco prima della finale return hexhash;)


Aggiungi questo primo blocco di linee immediatamente sotto le #includeintestazioni esistenti

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

Ecco la funzione modificata

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

Non sono riuscito a scoprire se questi possono davvero essere applicati alle playlist, ma è possibile esaminare gli elenchi di decisioni di modifica (EDL). Ecco alcuni link per iniziare:

  1. Manuale di MPlayer sul supporto EDL

  2. Tutorial MPlayer EDL

  3. Editing video dall'articolo della riga di comando di LinuxGazette

  4. Il sensibile progetto cinematografico

Se non ti dispiace le piccole pause tra i video, potresti semplicemente eseguire mplayer più volte da uno script con file EDL diversi ogni volta. Se le pause sono un no-no, forse dovresti creare un nuovo video proprio come suggerito da Varrtto.


Grazie, tuttavia, usando la riga di comando, penso che usare mplayers -ss e -endpos + le mie macro di emacs sia il modo migliore per andare (vedi le mie aggiunte al post originale). Quello che voglio davvero è una bella interfaccia grafica.
studente
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.