Listas de reproducción de video con horas de inicio y finalización

10

¿Existe una buena aplicación GUI (por ejemplo, una GUI de mplayer o algo así como banshee) para Linux que permita crear y editar listas de reproducción (para archivos de video) con diferentes tiempos de inicio y finalización para cada video de la lista?

Añadido :

En este momento hago manualmente los archivos que contienen algo así:

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

video2.mp4 -ss 112 -endpos 2112

Luego tengo un script de envoltura para: mplayer -fs $(grep -v "^ #" $1)

Además, he escrito algunas funciones de emacs que simplifican un poco la edición de dichos archivos. (Como convertir la hora de inicio y finalización del formato hh: mm: ss a segundos y la hora de finalización a una posición relativa (hora de finalización - hora de inicio) según lo requerido por -endpos (puedo publicar las macros si alguien está interesado). Sin embargo, todavía es demasiado incómodo. Entonces, mi pregunta es si hay una buena GUI para hacer esto (por ejemplo, que le permite marcar en una línea de tiempo de video las horas de inicio y finalización de la lista de reproducción, etc.).

estudiante
fuente
@ user5289: Si solo le interesan las respuestas para Ubuntu (no mencionó una distribución en su pregunta), puede elegir en qué sitio preguntar. Si prefiere Ask Ubuntu, use el flagbotón en su pregunta y solicite que se migre.
Gilles 'SO- deja de ser malvado'
1
@ user5289 ¿Es todo lo que quieres ... poder reproducir el video en una GUI (porque 'mplayer' ciertamente no es una GUI)? ... o desea poder establecer las posiciones de tiempo en una GUI (también)? ... porque puedes usar Smplayer para usar tus "comandos cronometrados" existentes ... He escrito un guión para hacer eso ... Publicaré el guión como y responderé ... alguien puede encontrarlo interesante ... Ciertamente encontrado su método interesante .. y yo he adaptado a SMPlayer ..
Peter.O
@ fred.bear, sí, el punto es que quiero poder establecer las posiciones de tiempo en una GUI, editar toda la lista de reproducción en una GUI de una manera cómoda. (Jugar en una GUI no es importante)
estudiante
@ user5289: Es bastante posible establecer las posiciones de tiempo en una GUI ... Lo hago con Smplayer ... Agregué el nuevo timestampsscript a mi respuesta original que solo mostraba un play-it-in-Smplayerscript
Peter.O

Respuestas:

3

Tal vez me estoy equivocando, ya que el inglés no es mi primer idioma, pero ¿no sería mejor si editaras el video con una herramienta como Kino en lugar de hacer una lista de reproducción como esa?

Puede ajustar los tiempos de inicio y finalización como desee, y no creo que sea tan difícil.

varrtto
fuente
2
Sí, sé cómo cortar videos usando Kino o algo así. La pregunta es realmente sobre listas de reproducción, no sobre hacer nuevos videos. Hacer tales listas de reproducción sería muy rápido, flexible y no consumiría espacio en disco adicional.
estudiante
3

ACTUALIZACIÓN-2: Después de enviar el siguiente script, me di cuenta de que otra forma de configurar las posiciones de tiempo (en una GUI) es usar un Editor de subtítulos (por ejemplo gnome-subtitles). Puede hacer clic para marcar las posiciones inicial y final de los "subtítulos fantasmas"; en realidad, puede poner su ruta de archivo y comentarios como "subtítulo" ... Algunos formatos no son adecuados (por ejemplo, usando números de fotogramas) ... 'ViPlay Subtitle File', Power DivX y 'Adobe Encore DVD' bueno.

ACTUALIZACIÓN-1; un nuevo script ... Este script no le dará la capacidad de una lista de reproducción integrada, pero le permitirá seleccionar y guardar y modificar los tiempos de inicio y finalización dentro de Smplayer, sin la necesidad de escribir nada.

Esta información se guarda en un archivo de configuración, cuyas rutas de archivo se pueden "reproducir" individualmente o agrupadas en una secuencia, a través de otro script (similar a mi script 'play', o como sus scripts Emacs).

Funciona utilizando el Seekdiálogo de Smplayer ... xmacromanipula el diálogo (descubrí que necesita sleep .3entre comandos xmacro) ... Los tiempos se almacenan en formato HH: MM: SS en un archivo en ~/.config/smplayer... La primera línea es el Hora de inicio, la segunda línea es la Hora de finalización, y la tercera línea está ahí para especificar un directorio raíz ... Esta tercera línea se utiliza como un indicador de ruta opcional por el script de seguimiento que modifica una configuración de configuración de muestra mediante imprimándolo con -ssy -endpos... El archivo de configuración de marcas de tiempo se llama igual que el archivo de medios, con un .smplaysufijo ...

Entonces, esto no es todo lo que desea, pero puede ayudarlo a configurar los tiempos sin tener que escribir ...

Aquí está el script 'obtener marcas de tiempo':

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

El siguiente script es mi scrpt original 'play ". Es independiente del script de evitar Timestamp, pero no tomaría mucho para que trabajen juntos ...

Conducirá a Smplayer, que usa mplayer internamente ... es, al menos, una GUI normal, pero tu lista de reproducción debería estar en tu editor de texto ... y obviamente ya conoces ese método :)

Intenté esto hace un par de años, pero me había olvidado por completo, ya que a menudo no necesito tal cosa, pero es bueno mantener "marcadores". Me alegra que hayas resucitado la idea. Aquí está el script ... que realmente solo hace lo mismo que has estado haciendo, pero para Smplayer (una GUi de 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
fuente
Gracias por la actualización. ¿Podría agregar una instrucción paso a paso sobre cómo usar el script?
estudiante
@ usuario5289. Solo debería requerir que tengas un reproductor abierto con tu video, y el guión está asociado como una tecla de acceso directo (uso xbindkeys, pero cualquier cosa funcionará). Luego, en cualquier punto de la película, puedes presionar tu acceso directo -clave .. Debido a que utiliza una macro que no está relacionada con smplayer, no debe hacer nada (clic en el teclado o el mouse) hasta que aparezca el segundo diálogo. Necesita 1-2 segundos para marcar "¿Es esta la ventana correcta? Etc" y abrir el "cuadro de diálogo de búsqueda" de smplayer desde el cual la macro copia la posición de tiempo actual que se presenta en HH: MM: SS .. No interrumpa este cuadro de diálogo. ...
Peter
continúa ... La macro copiará la marca de tiempo en el clipoard y luego cerrará el "cuadro de diálogo de búsqueda". Aparecerá un segundo cuadro de diálogo (un cuadro de diálogo "zenity") ... le pedirá que haga 1 de 5 cosas. 1) use la marca de tiempo capturada como posición de inicio. 2) use la marca de tiempo capturada como posición final. 3) Desarmar la posición de inicio. 4) Posición de finalización desarmado. 5) Abra nautilus en el directorio que contiene el archivo "config" guardado. Los archivos de configuración se nombran de forma idéntica al video. (el nombre está tomado de la barra de título de Smplayer) ..
Peter
continúa ... Desde allí puede usar los tiempos que desee en sus scripts actuales ... Estoy trabajando en un script que se integra con Smplayer; Mi primer script de smplayer (que se muestra en mi respuesta original) es un poco ingenuo y muestra algunas opciones. Smplayer tiene una opción para mantener un historial de cada archivo que se haya reproducido. Esto se puede hacer en un solo archivo o archivos individuales ... El método de archivo individual (el predeterminado, creo que (?), Es el más adecuado, pero los nombres .ini están en hash. Actualmente estoy trabajando en imitar eso algoritmo ... así que estad atentos :)
Peter.O
continúa ... Necesitará tener estas aplicaciones instaladas ... xdotool xwininfo xmacro zenity sed(pero quién no tiene sed :), y por supuesto smplayer... Como lo mencioné, mi respuesta ... es solo una 'asistencia' ... hasta ahora , pero pensando en eso ahora, mientras escribo esto, ¡se puede hacer que se inserte en la lista de reproducción de jugadores normales! porque la lista de reproducción se reproducirá de acuerdo con los archivos .ini guardar smplayer (los que tienen los nombres de archivo hash). Esto se ve mejor y mejor ... pero realmente necesito un descanso :) ... demasiado smplayer por unos días. Todavía tengo que terminar ese algoritmo de hash
Peter
2

He agregado esta segunda respuesta, porque funciona como una lista de reproducción normal en SMPlayer, y es mejor aquí por claridad ...

Lo he hecho funcionar perfectamente a través de la lista de reproducción ...

Este método requiere una nueva compilación de SMPlayer y un método específico de denominación de archivos ... Solo se modifica una función en la fuente de SMPlayer y se agregan 3 encabezados al mismo archivo de fuente única ... He compilado smplayer_0.6.8para Lucid ... Uso de Maveric y Meerkat smplayer_0.6.9... Una línea en la versión posterior es diferente, pero eso no altera nada ... Aquí está la función modificada y los encabezados parasmplayer_0.6.8

por cierto, el diálogo zenity en mi respuesta anterior todavía es útil para capturar los tiempos de inicio y finalización ...

RECORDATORIO : los siguientes segmentos de origen son para smplayer_0.6.8... El archivo a modificar es: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... Los nuevos segmentos son los mismos para '0.6.8' y '0.6.9', pero los originales difieren en una línea (muy cerca de el final; justo antes de la final return hexhash;)


Agregue este primer bloque de líneas inmediatamente debajo de los #includeencabezados existentes

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

Aquí está la función modificada

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
fuente
1

No pude encontrar si realmente se pueden aplicar a las listas de reproducción, pero puede consultar Editar listas de decisiones (EDL). Aquí hay algunos enlaces para comenzar:

  1. Manual de MPlayer sobre soporte EDL

  2. Tutorial de MPlayer EDL

  3. Edición de video desde el artículo de LinuxGazette de la línea de comandos

  4. El proyecto de cine sensible

Si no le importan las pequeñas pausas entre los videos, puede ejecutar mplayer varias veces desde un script con diferentes archivos EDL cada vez. Si las pausas son un no-no, entonces tal vez debería crear un nuevo video tal como lo sugirió varrtto.

jpc
fuente
Sin embargo, gracias a la línea de comandos, creo que usar mplayers -ss y -endpos + mis macros emacs es la mejor manera de hacerlo (ver mis adiciones a la publicación original). Lo que realmente quiero es una buena GUI.
estudiante