Listes de lecture vidéo avec heures de début et de fin

10

Existe-t-il une bonne application graphique (par exemple une interface graphique mplayer ou quelque chose comme banshee) pour linux qui permet de créer et de modifier des listes de lecture (pour les fichiers vidéo) avec des heures de démarrage et d'arrêt différentes pour chaque vidéo de la liste?

Ajouté :

Pour le moment, je crée manuellement des fichiers qui contiennent quelque chose comme ça:

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

video2.mp4 -ss 112 -endpos 2112

Ensuite, j'ai un script wrapper pour: mplayer -fs $(grep -v "^ #" $1)

De plus, j'ai écrit quelques fonctions emacs qui simplifient un peu l'édition de ces fichiers. (Comme convertir les heures de début et de fin du format hh: mm: ss en secondes et l'heure de fin en position relative (heure de fin - heure de début) comme requis par -endpos (je peux publier les macros si quelqu'un est intéressé). Cependant, c'est encore trop inconfortable. Donc, ma question est de savoir s'il existe une belle interface graphique pour ce faire (par exemple, qui vous permet de marquer dans une chronologie vidéo les heures de début et de fin de la liste de lecture, etc.).

étudiant
la source
@ user5289: Si vous êtes uniquement intéressé par les réponses pour Ubuntu (vous n'avez pas mentionné de distribution dans votre question), vous pouvez choisir sur quel site demander. Si vous préférez Ask Ubuntu, utilisez le flagbouton sur votre question et demandez à ce qu'elle soit migrée.
Gilles 'SO- arrête d'être méchant'
1
@ user5289 Est-ce tout ce que vous voulez ... pour pouvoir lire la vidéo dans une interface graphique (car 'mplayer' n'est certainement pas une interface graphique)? ... ou voulez-vous pouvoir définir les positions temporelles dans une interface graphique (également)? .. parce que vous pouvez simplement utiliser Smplayer pour utiliser vos "commandes chronométrées" existantes .. J'ai écrit un script pour faire exactement cela ... Je posterai le script en tant que et répondrai ... quelqu'un peut le trouver intéressant ... Je certainement trouvé votre méthode intéressante .. et je viens de l'adapter à Smplayer ..
Peter.O
@ fred.bear, oui, le fait est que je veux pouvoir définir les positions temporelles dans une interface graphique, éditer la liste de lecture entière dans une interface graphique d'une manière confortable. (Jouer dans une interface graphique n'est pas important)
étudiant
@ user5289: Il est tout à fait possible de définir les positions temporelles dans une interface graphique ... Je le fais avec Smplayer .... J'ai ajouté le nouveau timestampsscript à ma réponse d'origine qui ne montrait qu'un play-it-in-Smplayerscript
Peter.O

Réponses:

3

Peut-être que je me trompe, car l'anglais n'est pas ma première langue, mais ne serait-il pas préférable que vous éditiez la vidéo avec un outil comme Kino au lieu de créer une liste de lecture comme ça?

Vous pouvez ajuster les heures de début et de fin à votre guise, et je ne pense pas que ce serait si difficile.

varrtto
la source
2
Oui, je sais comment couper des vidéos en utilisant Kino ou quelque chose comme ça. La question concerne vraiment les playlists, pas la création de nouvelles vidéos. Faire de telles listes de lecture serait très rapide, flexible et ne consommerait pas d'espace disque supplémentaire.
étudiant
3

UPDATE-2: Après avoir soumis le script suivant, il m'est apparu qu'une autre façon de configurer des positions temporelles (dans une interface graphique) est d'utiliser un éditeur de sous-titres (par exemple. gnome-subtitles). Vous pouvez simplement cliquer pour marquer les positions de début et de fin des "sous-titres fantômes"; en fait, vous pouvez mettre votre chemin de fichier et vos commentaires en tant que "sous-titre" ... Certains formats ne conviennent pas (par exemple, en utilisant des numéros de trame) .. "ViPlay Subtitle File", Power DivX et "Adobe Encore DVD" look bien.

UPDATE-1; un nouveau script ... Ce script ne vous donnera pas de capacité de liste de lecture intégrée, mais il vous permettra de sélectionner et d'enregistrer et de modifier les heures de début et de fin dans Smplayer, sans avoir besoin de taper quoi que ce soit.

Ces informations sont enregistrées dans un fichier de configuration, dont les chemins de fichiers peuvent être "lus" individuellement, ou regroupés dans une séquence, via un autre script (similaire à mon script 'play', ou comme vos scripts Emacs).

Il fonctionne en utilisant la Seekboîte de dialogue de Smplayer ... xmacromanipule la boîte de dialogue (j'ai trouvé qu'il a besoin sleep .3entre les commandes xmacro) ... Les heures sont stockées au format HH: MM: SS dans un fichier en ~/.config/smplayer... La 1ère ligne est la Heure de début, la 2e ligne est l'heure de fin et la 3e ligne est là pour spécifier un répertoire racine ... Cette 3e ligne est utilisée comme indicateur de chemin facultatif par le script de suivi qui modifie un paramètre de configuration de smplayer en l'amorçage avec -sset -endpos... Le fichier de configuration des horodatages est nommé de la même manière que le fichier multimédia, avec un .smplaysuffixe ...

Ce n'est donc pas tout ce que vous voulez, mais cela peut aider à configurer les heures sans aucune saisie ...

Voici le 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  

Le script suivant est mon scrpt original "play". Il est indépendant du script avove Timestamp, mais il ne faudrait pas grand-chose pour les faire travailler ensemble ...

Il 'pilotera' Smplayer, qui utilise mplayer en interne .. c'est, au moins, une interface graphique normale, mais votre liste de lecture devrait être dans votre éditeur de texte .. et vous connaissez évidemment déjà cette méthode :)

J'ai essayé cela il y a quelques années, mais j'avais tout oublié car je n'ai pas souvent besoin d'une telle chose, mais il est bon de garder des "signets" .. Je suis content que vous ayez ressuscité l'idée. Voici le script ... qui ne fait vraiment que la même chose que vous avez fait, mais pour Smplayer (une interface graphique 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
Peter.O
la source
Merci pour la mise à jour. Pourriez-vous ajouter une instruction étape par étape sur la façon d'utiliser le script?
étudiant
@ user5289. Cela devrait seulement nécessiter que smplayer soit ouvert avec votre vidéo, et le script est associé avec une touche de raccourci (j'utilise xbindkeys, mais tout fera l'affaire). Vous pouvez alors, à tout moment dans le film, appuyer simplement sur votre raccourci -key .. Parce qu'il utilise une macro qui n'est pas liée à smplayer, vous ne devriez rien faire (clavier ou souris) jusqu'à ce que la 2ème boîte de dialogue apparaisse. Il faut 1 à 2 secondes pour vérifier "Est-ce la bonne fenêtre? Etc" et ouvrir la "boîte de dialogue" de smplayer à partir de laquelle la macro copie la position temporelle actuelle qui est présentée dans HH: MM: SS .. N'interrompez pas cette boîte de dialogue. ...
Peter.O
suite ... La macro copiera l'horodatage dans le presse-papiers puis fermera la "boîte de dialogue de recherche" .. Une deuxième boîte de dialogue apparaîtra alors (une boîte de dialogue "zénité") ... Elle vous invitera à faire 1 des 5 choses. 1) utilisez l'horodatage capturé comme position de départ. 2) utilisez l'horodatage capturé comme position de fin. 3) Désinstaller la position de départ. 4) Position finale non réglée. 5) Ouvrez nautilus dans le répertoire qui contient le fichier "config" enregistré. Les fichiers de configuration sont nommés de manière identique à la vidéo. (le nom est tiré de la barre de titre de Smplayer) ..
Peter.O
suite ... De là, vous pouvez utiliser les heures comme vous le souhaitez dans vos scripts actuels ... Je travaille sur un script qui s'intègre à Smplayer; Mon premier script smplayer (montré dans ma réponse d'origine) est un peu naïf et déclenche certaines options. Smplayer a une option pour garder un historique de chaque fichier jamais joué. Cela peut être fait dans un seul fichier ou des fichiers individuels ... La méthode de fichier individuel (par défaut, je pense (?), Est la plus appropriée, mais les noms .ini sont hachés. Je travaille actuellement sur la mimisation qui a algorithme ... alors restez à l'écoute :)
Peter.O
suite ... Vous aurez besoin d'avoir ces applications installées .. xdotool xwininfo xmacro zenity sed(mais qui n'a pas séduit :), et bien sûr smplayer... Comme je l'ai mentionné ma réponse .. ce n'est qu'un 'asssist' .. jusqu'à présent , mais en y réfléchissant en ce moment, au moment où j'écris ceci, il peut être fait pour se greffer à la playlist de smplayer normale! parce que la liste de lecture sera lue conformément aux fichiers de sauvegarde smplayer .ini (ceux avec les noms de fichiers hachés) .. Cela semble meilleur et meilleur .. mais j'ai vraiment besoin d'une pause :) .. trop de smplayer pendant quelques jours. Je dois encore finir cet algorithme de hachage
Peter.O
2

J'ai ajouté cette deuxième réponse, car cela fonctionne comme une liste de lecture normale dans SMPlayer, et c'est mieux ici pour plus de clarté ...

Je l'ai fait fonctionner sans problème via la playlist ...

Cette méthode nécessite une recompilation de SMPlayer, et une méthode de dénomination de fichier spécifique ... Une seule fonction dans la source de SMPlayer est modifiée, et 3 en-têtes sont ajoutés au même fichier source unique ... J'ai compilé smplayer_0.6.8pour Lucid .. Utilisation de Maveric et Meerkat smplayer_0.6.9.. Une ligne dans la dernière version est différente, mais cela ne dérange rien ... Voici la fonction modifiée et les en-têtes poursmplayer_0.6.8

btw, la boîte de dialogue zenity dans ma réponse précédente est toujours utile pour capturer les heures de début et de fin ...

RAPPEL - Les segments source suivants sont pour smplayer_0.6.8... Le fichier à modifier est: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... Les nouveaux segments sont les mêmes pour '0.6.8' et '0.6.9', mais les originaux diffèrent d'une ligne (très proche de la fin; juste avant la finale return hexhash;)


Ajoutez ce premier bloc de lignes juste en dessous des en- #includetêtes existants

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

Voici la fonction modifiée

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
la source
1

Je n'ai pas réussi à déterminer si celles-ci peuvent vraiment être appliquées aux listes de lecture, mais vous pouvez consulter les listes de décision d'édition (EDL). Voici quelques liens pour vous aider à démarrer:

  1. Manuel MPlayer sur la prise en charge EDL

  2. Tutoriel MPlayer EDL

  3. Montage vidéo depuis la ligne de commande de l' article LinuxGazette

  4. Le projet de cinéma sensible

Si cela ne vous dérange pas les petites pauses entre les vidéos, vous pouvez simplement exécuter mplayer plusieurs fois à partir d'un script avec différents fichiers EDL à chaque fois. Si les pauses sont un non-non, alors vous devriez peut-être créer une nouvelle vidéo comme l'a suggéré varrtto.

jpc
la source
Merci, cependant, en utilisant la ligne de commande, je pense que l'utilisation de mplayers -ss et -endpos + mes macros emacs est la meilleure façon de procéder (voir mes ajouts au message d'origine). Ce que je veux vraiment, c'est une belle interface graphique.
étudiant