Lista de reprodução de vídeos com horários de início e término

10

Existe uma boa aplicação GUI (por exemplo, uma GUI do mplayer ou algo como o banshee) para o Linux, que permite criar e editar listas de reprodução (para arquivos de vídeo) com diferentes horários de início e término para cada vídeo?

Adicionado :

No momento, faço arquivos manualmente que contêm algo assim:

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

video2.mp4 -ss 112 -endpos 2112

Então eu tenho um script de wrapper para: mplayer -fs $(grep -v "^ #" $1)

Além disso, escrevi algumas funções do emacs que simplificam um pouco a edição de tais arquivos. (Como converter a hora inicial e final do formato hh: mm: ss para segundos e hora final para a posição relativa (hora final - hora de início) conforme exigido por -endpos (eu posso postar as macros se alguém estiver interessado.) No entanto, isso ainda é muito desconfortável. Então, minha pergunta é se há uma interface gráfica agradável para fazer isso (por exemplo, que permite marcar em uma linha de tempo de vídeo as horas de início e término da lista de reprodução e assim por diante).

    
por student 08.03.2011 / 10:35

4 respostas

3

Talvez eu esteja fazendo a pergunta errada, já que o inglês não é meu primeiro idioma, mas não seria melhor se você editasse o vídeo com uma ferramenta como Kino em vez de criar uma playlist como isso?

Você pode ajustar os horários de início e de término conforme desejar e não acho que seria tão difícil.

    
por 22.03.2011 / 21:02
3

UPDATE-2: Depois de enviar o script a seguir, percebi que outra maneira de configurar posições de tempo (em uma GUI) é usar um Editor de Legendas (por exemplo, gnome-subtitles ). Você pode apenas clicar para marcar as posições inicial e final de "legendas fantasmas"; na verdade, você pode colocar o seu caminho de arquivo e comentários como "subtítulo" ... Alguns formatos não são adequados (por exemplo, usando números de quadros) ... "ViPlay Subtitle File", Power DivX e 'Adobe Encore DVD' Boa.

UPDATE-1; um novo script ... Este script não lhe dará capacidade de reprodução integrada, mas permitirá que você selecione e salve e modifique os horários de início e fim dentro do Smplayer, sem a necessidade de digitar nada.

Esta informação é salva em um arquivo de configuração, os caminhos dos arquivos podem ser "reproduzidos" individualmente ou agrupados em uma sequência, por meio de outro script (semelhante ao meu script 'play' ou como seus scripts do Emacs) ..

Funciona utilizando o Seek dialog ... xmacro do Smplayer manipula o diálogo (descobri que ele precisa de sleep .3 entre os comandos xmacro) ... Os tempos são armazenados no formato HH: MM: SS em um arquivo em ~/.config/smplayer ... A primeira linha é a hora de início, a segunda linha é a hora de término e a terceira linha está lá para especificar um diretório raiz ... Esta terceira linha é usada como opcional indicador de caminho pelo script de acompanhamento que modifica uma configuração de configuração do smplayer, preparando-o com -ss e -endpos ... O arquivo de configuração de carimbos de data e hora é nomeado igual ao arquivo de mídia, com um sufixo .smplay ...

Então, isso não é tudo que você quer, mas pode ajudar a configurar os horários sem digitar ...

Aqui está o script "obter registros de data e hora":

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

O script a seguir é o scrpt original de "play" .É independente do script avove Timestamp, mas não demoraria muito para que trabalhassem juntos ...

Ele vai 'dirigir' o Smplayer, que usa o mplayer internamente .. é, pelo menos, uma GUI normal, mas sua playlist precisa estar no seu editor de texto .. e obviamente você já conhece esse método :)

Eu tentei isso um par de anos atrás, mas eu tinha esquecido tudo sobre isso como eu não costumo precisar de uma coisa dessas, mas é bom manter "bookmarks" .. Eu estou feliz que você tenha ressuscitado a idéia .. Aqui está o script ... que realmente só faz o mesmo que você tem feito, mas para o Smplayer (um 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                                     
#                                                                                                                
 sed -i -e "s/^\(mplayer_additional_options.*\)\( \|=\)\(-ss \+\)\([^ ]\+\)\( .*\)\(-endpos \+\)\([0-9:mb]\+\)\(.*\)/${2}${3}/"  $HOME/.config/smplayer/smplayer.ini
(smplayer "$file" 
 sed -i -e "s/^\(mplayer_additional_options.*\)\( \|=\)\(-ss \+\)\([^ ]\+\)\( .*\)\(-endpos \+\)\([0-9:mb]\+\)\(.*\)/${a}${z}/"  $HOME/.config/smplayer/smplayer.ini
)
exit
    
por 25.03.2011 / 12:45
1

Não consegui descobrir se elas podem realmente ser aplicadas a listas de reprodução, mas você pode pesquisar em EDLs (Edit Decision Lists). Aqui estão alguns links para você começar:

  1. Manual do MPlayer sobre o suporte EDL

  2. tutorial do MPlayer EDL

  3. Edição de vídeo a partir da linha de comando Artigo do LinuxGazette

  4. O sensato projeto de cinema

Se você não se importa com as pequenas pausas entre os vídeos, você pode executar o mplayer várias vezes a partir de um script com arquivos EDL diferentes a cada vez. Se as pausas são um não-não, então talvez você deva criar um novo vídeo como o varrtto sugeriu.

    
por 22.03.2011 / 22:58
1

Adicionei esta segunda resposta, porque funciona como uma lista de reprodução normal no SMPlayer, e é melhor aqui para maior clareza ...

Eu trabalhei sem problemas através da playlist ...

Este método requer uma recompilação do SMPlayer e um método específico de nomeação de arquivos ... Apenas uma função no código-fonte do SMPlayer é modificada e três cabeçalhos são adicionados ao mesmo arquivo de origem ... Eu compilei smplayer_0.6.8 para Lucid ... Maveric e Meerkat usam smplayer_0.6.9 .. Uma linha na última versão é diferente, mas isso não atrapalha nada ... Aqui está a função modificada e os cabeçalhos para smplayer_0.6.8

btw, o diálogo do zenity na minha resposta anterior ainda é útil para capturar os horários de início e fim ...

LEMBRETE - Os seguintes segmentos de origem são para smplayer_0.6.8 ... O arquivo a ser modificado é: ../smplayer-0.6.9/src/findsubtitles/osparser.cpp ... Os novos segmentos são os mesmos para '0.6.8' e ' 0.6.9 ', mas os originais diferem por uma linha (muito perto do final; pouco antes do final return hexhash; )

Adicione este primeiro bloco de linhas imediatamente abaixo dos cabeçalhos #include existentes

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

Aqui está a função 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;
}
    
por 20.05.2011 / 22:27