Video-Wiedergabelisten mit Start- und Endzeiten

10

Gibt es eine gute GUI-Anwendung (zum Beispiel eine Mplayer-GUI oder so etwas wie Banshee) für Linux, mit der Wiedergabelisten (für Videodateien) mit unterschiedlichen Start- und Stoppzeiten für jedes Video in der Liste erstellt und bearbeitet werden können?

Hinzugefügt :

Im Moment mache ich manuell Dateien, die so etwas enthalten:

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

video2.mp4 -ss 112 -endpos 2112

Dann habe ich ein Wrapper-Skript für: mplayer -fs $(grep -v "^ #" $1)

Außerdem habe ich einige Emacs-Funktionen geschrieben, die das Bearbeiten solcher Dateien ein wenig vereinfachen. (Wie das Konvertieren der Start- und Endzeit vom Format hh: mm: ss in Sekunden und der Endzeit in die relative Position (Endzeit - Startzeit) gemäß den Anforderungen von -endpos (ich kann die Makros posten, wenn jemand interessiert ist). Dies ist jedoch immer noch zu unangenehm. Meine Frage ist also, ob es dafür eine nette GUI gibt (zum Beispiel, mit der Sie die Start- und Endzeiten für die Wiedergabeliste usw. in einer Video-Timeline markieren können).

Schüler
quelle
@ user5289: Wenn Sie nur an Antworten für Ubuntu interessiert sind (Sie haben in Ihrer Frage keine Distribution erwähnt), können Sie auswählen, auf welcher Site Sie fragen möchten. Wenn Sie Ask Ubuntu bevorzugen, verwenden Sie die flagSchaltfläche für Ihre Frage und fordern Sie die Migration an.
Gilles 'SO - hör auf böse zu sein'
1
@ user5289 Ist alles was du willst .. um das Video in einer GUI abspielen zu können (weil 'mplayer' sicherlich keine GUI ist)? ... oder möchten Sie (auch) die Zeitpositionen in einer GUI einstellen können? .. weil Sie einfach Smplayer verwenden können, um Ihre vorhandenen "zeitgesteuerten Befehle" zu verwenden .. Ich habe ein Skript geschrieben, um genau das zu tun .. Ich werde das Skript als posten und antworten .. jemand könnte es interessant finden .. Ich sicherlich fand deine Methode interessant .. und ich habe sie gerade an Smplayer angepasst ..
Peter.O
@ fred.bear, ja, der Punkt ist, dass ich in der Lage sein möchte, die Zeitpositionen in einer GUI festzulegen und die gesamte Wiedergabeliste in einer GUI auf bequeme Weise zu bearbeiten. (Das Spielen in einer GUI ist nicht wichtig)
Student
@ user5289: Es ist durchaus möglich, die Zeitpositionen in einer GUI festzulegen ... Ich mache es mit Smplayer ... Ich habe das neue timestampsSkript zu meiner ursprünglichen Antwort hinzugefügt, die nur ein play-it-in-SmplayerSkript zeigte
Peter.O

Antworten:

3

Vielleicht verstehe ich die Frage falsch, da Englisch nicht meine Muttersprache ist, aber wäre es nicht besser, wenn Sie das Video mit einem Tool wie Kino bearbeiten würden, anstatt eine solche Wiedergabeliste zu erstellen ?

Sie können die Start- und Stoppzeiten nach Ihren Wünschen anpassen, und ich denke nicht, dass es so schwierig wäre.

varrtto
quelle
2
Ja, ich weiß, wie man Videos mit Kino oder ähnlichem schneidet. Bei der Frage geht es wirklich um Wiedergabelisten, nicht darum, neue Videos zu erstellen. Das Erstellen solcher Wiedergabelisten wäre sehr schnell, flexibel und würde keinen zusätzlichen Speicherplatz beanspruchen.
Student
3

UPDATE-2: Nachdem ich das folgende Skript eingereicht hatte, wurde mir klar, dass eine andere Möglichkeit zum Einrichten von Zeitpositionen (in einer GUI) die Verwendung eines Untertitel-Editors (z. B. gnome-subtitles) ist. Sie können einfach klicken, um die Start- und Endpositionen von "Phantom-Untertiteln" zu markieren. Tatsächlich können Sie Ihren Dateipfad und Ihre Kommentare als "Untertitel" eingeben ... Einige Formate sind nicht geeignet (z. B. mit Frame-Nummern). "ViPlay-Untertiteldatei", Power DivX und "Adobe Encore DVD" sehen aus gut.

UPDATE-1; Ein neues Skript ... Mit diesem Skript können Sie keine integrierten Wiedergabelisten erstellen. Sie können jedoch Anfangs- und Endzeiten in Smplayer auswählen, speichern und ändern, ohne etwas eingeben zu müssen.

Diese Informationen werden in einer Konfigurationsdatei gespeichert, deren Dateipfade einzeln oder in einer Sequenz über ein anderes Skript (ähnlich meinem 'Play'-Skript oder wie Ihre Emacs-Skripte) "abgespielt" werden können.

Es funktioniert unter Verwendung des Smplayer- SeekDialogs ... xmacromanipuliert den Dialog (ich habe festgestellt, dass er sleep .3zwischen xmacro-Befehlen benötigt wird) ... Die Zeiten werden im HH: MM: SS-Format in einer Datei gespeichert in ~/.config/smplayer... Die erste Zeile ist die Startzeit, die 2. Zeile ist die Endzeit und die 3. Zeile dient zur Angabe eines Stammverzeichnisses ... Diese 3. Zeile wird vom Folgeskript als optionale Pfadanzeige verwendet, mit der eine Smplayer-Konfigurationseinstellung von geändert wird Grundierung mit -ssund -endpos... Die Konfigurationsdatei für Zeitstempel hat den gleichen Namen wie die Mediendatei mit dem .smplaySuffix ...

Das ist also nicht alles, was Sie wollen, aber es kann hilfreich sein, die Zeiten ohne Eingabe festzulegen ...

Hier ist das Skript "Zeitstempel abrufen":

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

Das folgende Skript ist mein ursprüngliches 'play'-Skript. Es ist unabhängig vom avove Timestamp-Skript, aber es würde nicht viel dauern, bis sie zusammenarbeiten ...

Es wird Smplayer "fahren", der mplayer intern verwendet. Es ist zumindest eine normale GUI, aber Ihre Wiedergabeliste muss sich in Ihrem Texteditor befinden. Und Sie kennen diese Methode offensichtlich bereits :)

Ich habe es vor ein paar Jahren versucht, aber ich hatte alles vergessen, da ich so etwas nicht oft brauche, aber es ist gut, "Lesezeichen" zu behalten. Ich bin froh, dass Sie die Idee wiederbelebt haben. Hier ist das Skript ... das wirklich nur das Gleiche tut wie Sie, aber für Smplayer (eine Mplayer-GUi)

#
# 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
Peter.O
quelle
Danke für das Update. Können Sie eine schrittweise Anleitung zur Verwendung des Skripts hinzufügen?
Student
@ user5289. Es sollte nur erforderlich sein, dass Sie den Smplayer mit Ihrem Video geöffnet haben und das Skript als Tastenkombination zugeordnet ist (ich verwende xbindkeys, aber alles wird funktionieren). Sie können dann zu jedem Zeitpunkt im Film einfach die Tastenkombination drücken -key .. Da ein Makro verwendet wird, das nicht mit smplayer zusammenhängt, sollten Sie nichts tun (Tastatur oder Mausklick), bis das zweite Dialogfeld angezeigt wird. Es dauert 1-2 Sekunden, um "Ist dies das richtige Fenster? Usw." zu überprüfen und den "Suchdialog" des Smplayers zu öffnen, aus dem das Makro die aktuelle Zeitposition kopiert, die in HH: MM: SS angezeigt wird. Unterbrechen Sie diesen Dialog nicht. ...
Peter.O
Fortsetzung ... Das Makro kopiert den Zeitstempel in das Clipoard und schließt dann den "Suchdialog". Ein zweiter Dialog wird angezeigt (ein "Zenity" -Dialog) ... Sie werden aufgefordert, 1 von 5 Dingen auszuführen. 1) Verwenden Sie den erfassten Zeitstempel als Startposition. 2) Verwenden Sie den erfassten Zeitstempel als Endposition. 3) Startposition deaktivieren. 4) Unbestimmte Endposition. 5) Öffnen Sie nautilus in dem Verzeichnis, in dem sich die gespeicherte "config" -Datei befindet. Die Konfigurationsdateien sind identisch mit dem Video benannt. (Der Name stammt aus der Titelleiste von Smplayer.)
Peter.O
Fortsetzung ... Von dort aus können Sie die Zeiten nach Belieben in Ihren aktuellen Skripten verwenden ... Ich arbeite an einem Skript, das in Smplayer integriert ist. Mein erstes Smplayer-Skript (in meiner ursprünglichen Antwort gezeigt) ist ein bisschen naiv und bietet einige Optionen. Smplayer bietet die Option, einen Verlauf jeder jemals abgespielten Datei zu führen. Dies kann in einer einzelnen Datei oder in einzelnen Dateien erfolgen ... Die Methode für einzelne Dateien (die Standardeinstellung, denke ich (?), Ist am besten geeignet, aber die INI-Namen sind gehasht. Ich arbeite derzeit daran, diese nachzuahmen Algorithmus ... also bleiben Sie dran :)
Peter.O
Fortsetzung ... Sie müssen diese Apps installiert haben .. xdotool xwininfo xmacro zenity sed(aber wer hat nicht sed :) und natürlich smplayer... Wie ich schon sagte, meine Antwort .. es ist nur ein "Assistent" .. bis jetzt , aber wenn ich gerade darüber nachdenke, während ich dies schreibe, kann es dazu gebracht werden, in die normale Smplayer-Wiedergabeliste aufgenommen zu werden! weil die Wiedergabeliste in Übereinstimmung mit den gespeicherten INI-Dateien des Smplayers abgespielt wird (die mit den gehashten Dateinamen). Das sieht besser und besser aus. Aber ich brauche dringend eine Pause :) .. zu viel Smplayer für ein paar Tage. Ich muss diesen Hashing-Algorithmus noch beenden
Peter.O
2

Ich habe diese zweite Antwort hinzugefügt, da sie in SMPlayer als normale Wiedergabeliste funktioniert und aus Gründen der Übersichtlichkeit hier besser ist ...

Ich habe es über die Wiedergabeliste einwandfrei funktionieren lassen ...

Diese Methode erfordert eine Neukompilierung von SMPlayer und eine bestimmte Dateinamensmethode ... Nur eine Funktion in der SMPlayer-Quelle wird geändert, und 3 Header werden derselben einzelnen Quelldatei hinzugefügt ... Ich habe smplayer_0.6.8für Lucid kompiliert . Maveric und Meerkat verwenden smplayer_0.6.9.. Eine Zeile in der späteren Version ist anders, aber das stört nichts ... Hier ist die modifizierte Funktion und Überschriften fürsmplayer_0.6.8

Übrigens ist der Zenity-Dialog in meiner vorherigen Antwort immer noch nützlich, um die Start- und Endzeiten zu erfassen ...

ERINNERUNG - Die folgenden Quellensegmente sind für smplayer_0.6.8... Die zu ändernde Datei ist: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... Die neuen Segmente sind für '0.6.8' und '0.6.9' identisch, aber die Originale unterscheiden sich um eine Zeile (sehr nahe an das Ende; kurz vor dem Finale return hexhash;)


Fügen Sie diesen ersten Zeilenblock direkt unter den vorhandenen #includeÜberschriften hinzu

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

Hier ist die modifizierte Funktion

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;
}
Peter.O
quelle
1

Ich konnte nicht herausfinden, ob diese wirklich auf Wiedergabelisten angewendet werden können, aber Sie können sich die EDLs (Edit Decision Lists) ansehen. Hier sind einige Links, die Ihnen den Einstieg erleichtern:

  1. MPlayer-Handbuch zur EDL-Unterstützung

  2. MPlayer EDL Tutorial

  3. Videobearbeitung über den Befehlszeilen- LinuxGazette-Artikel

  4. Das vernünftige Kinoprojekt

Wenn Ihnen die kleinen Pausen zwischen den Videos nichts ausmachen, können Sie mplayer jedes Mal mehrmals über ein Skript mit unterschiedlichen EDL-Dateien ausführen. Wenn Pausen ein Nein-Nein sind, sollten Sie vielleicht ein neues Video erstellen, wie es varrtto vorgeschlagen hat.

jpc
quelle
Dank der Befehlszeile denke ich jedoch, dass die Verwendung der mplayer -ss und -endpos + meiner Emacs-Makros der bessere Weg ist (siehe meine Ergänzungen zum ursprünglichen Beitrag). Was ich wirklich will, ist eine schöne GUI.
Student