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

10

Existe uma boa aplicação GUI (por exemplo, uma GUI mplayer ou algo parecido com banshee) para linux que permite criar e editar listas de reprodução (para arquivos de vídeo) com diferentes tempos de início e parada para cada vídeo da lista?

Adicionado :

No momento, eu faço manualmente arquivos 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 desses arquivos. (Como converter o horário de início e de término do formato hh: mm: ss para segundos e o horário de término para a posição relativa (horário de término - horário de início), conforme exigido por -endpos (posso postar as macros se alguém estiver interessado). Portanto, minha pergunta é se existe uma boa interface gráfica para isso (por exemplo, que permite marcar em uma linha do tempo do vídeo o horário de início e de término da lista de reprodução etc.).

aluna
fonte
@ user5289: Se você está interessado apenas nas respostas para o Ubuntu (você não mencionou uma distribuição na sua pergunta), pode escolher em qual site perguntar. Se você preferir o Ask Ubuntu, use o flagbotão na sua pergunta e solicite a migração.
Gilles 'SO- stop be evil' em
1
@ user5289 É tudo o que você deseja ... poder reproduzir o vídeo em uma GUI (porque 'mplayer' certamente não é uma GUI)? ... ou você deseja definir as posições de tempo em uma GUI (também)? .. porque você pode usar o Smplayer para usar seus "comandos programados" existentes. Eu escrevi um script para fazer exatamente isso. Vou postar o script como e responder .. alguém pode achar interessante .. Eu certamente encontrou o seu método interessante .. e eu tenho apenas adaptou para smplayer ..
Peter.O
@ fred.bear, sim, o ponto é que eu quero poder definir as posições de tempo em uma GUI, editar toda a lista de reprodução em uma GUI de alguma maneira confortável. (Jogando em uma GUI não é importante) #
estudante
@ user5289: É bem possível definir as posições de tempo em uma GUI ... Eu faço isso com o Smplayer .... Adicionei o novo timestampsscript à minha resposta original, que mostrava apenas um play-it-in-Smplayerscript
Peter.O

Respostas:

3

Talvez eu esteja entendendo 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 o Kino, em vez de criar uma lista de reprodução como essa?

Você pode ajustar os horários de partida e parada como quiser, e não acho que seria tão difícil.

varrtto
fonte
2
Sim, eu sei como cortar vídeos usando o Kino ou algo assim. A questão é realmente sobre playlists, não sobre como criar novos vídeos. Fazer essas listas de reprodução seria muito rápido, flexível e não consumiria espaço em disco adicional.
student
3

ATUALIZAÇÃO-2: Depois de enviar o seguinte script, percebi que outra maneira de configurar posições de tempo (em uma GUI) é usar um Editor de Legendas (por exemplo gnome-subtitles). Você pode simplesmente clicar para marcar as posições inicial e final das "legendas fantasmas"; na verdade, você pode colocar o caminho do arquivo e os comentários como a "legenda" ... Alguns formatos não são adequados (por exemplo, usando números de quadro). Boa.

UPDATE-1; um novo script ... Esse script não fornecerá a capacidade integrada da lista de reprodução, mas permitirá que você selecione e salve e modifique os horários de início e término no Smplayer, sem a necessidade de digitar nada.

Essas informações são salvas em um arquivo de configuração, cujos caminhos de arquivo podem ser "reproduzidos" individualmente ou agrupados em uma sequência, por outro script (semelhante ao meu script 'play' ou como os scripts do Emacs).

Funciona utilizando a Seekcaixa de diálogo de Smplayer ... xmacromanipula a caixa de diálogo (descobri que ela precisa sleep .3entre os comandos xmacro) ... Os horários 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 final e a terceira linha existe para especificar um diretório raiz ... Essa terceira linha é usada como um indicador de caminho opcional pelo script a seguir, que modifica uma configuração de smplayer por preparando-o com -sse -endpos... O arquivo de configuração dos registros de data e hora é igual ao arquivo de mídia, com um .smplaysufixo ...

Portanto, isso não é tudo o que você deseja, mas pode ajudar a definir os horários sem digitar ...

Aqui está o 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  

O script a seguir é o meu rascunho original 'play'. É independente do script do Timestamp, mas não demoraria muito para fazê-los trabalhar juntos ...

Ele irá 'dirigir' o Smplayer, que usa o mplayer internamente. É pelo menos uma GUI normal, mas sua lista de reprodução precisa estar no seu editor de texto. E você obviamente já conhece esse método :)

Eu tentei isso alguns anos atrás, mas havia me esquecido de tudo, porque muitas vezes não preciso disso, mas é bom manter "marcadores". Estou feliz que você tenha ressuscitado a idéia. Aqui está o script ... que realmente faz o mesmo que você tem feito, mas para Smplayer (uma GUI 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
fonte
Obrigado pela atualização. Você poderia adicionar instruções passo a passo sobre como usar o script?
estudante
@ user5289. Deve exigir apenas que você tenha o smplayer aberto com o seu vídeo, e o script está associado como uma tecla de atalho (eu uso xbindkeys, mas qualquer coisa serve) .. Você pode, em qualquer ponto do filme, apenas pressionar o atalho -chave .. Como utiliza uma macro não relacionada ao smplayer, você não deve fazer nada (clique no teclado ou no mouse) até que a segunda caixa de diálogo apareça. Ele precisa de 1 a 2 segundos para verificar "Esta é a janela certa? Etc" e abrir a "caixa de diálogo de busca" do smplayer, na qual a macro copia a posição de hora atual apresentada em HH: MM: SS .. Não interrompa essa caixa de diálogo. ...
Peter.O
continuação ... A macro copiará o carimbo de data / hora para a clipoard e fechará a "caixa de diálogo de busca". Uma segunda caixa de diálogo será exibida (uma caixa de diálogo "zenity") ... Ele solicitará que você faça 1 de 5 coisas. 1) use o registro de data e hora capturado como posição inicial. 2) use o registro de data e hora capturado como posição final. 3) Desativar posição inicial. 4) Desativar posição final. 5) Abra o nautilus no diretório que contém o arquivo "config" salvo. Os arquivos de configuração são nomeados de forma idêntica ao vídeo. (o nome é taked da barra de título da smplayer) ..
Peter.O
continua ... A partir daí, você pode usar os horários como quiser nos seus scripts atuais ... Estou trabalhando em um script que se integra ao Smplayer; Meu primeiro script smplayer (mostrado na minha resposta original) é um pouco ingênuo e apresenta algumas opções. O Smplayer tem uma opção para manter um histórico de todos os arquivos já reproduzidos. Isso pode ser feito em um único arquivo ou em arquivos individuais ... O método de arquivo individual (o padrão, eu acho (?), É o mais adequado, mas os nomes .ini estão com hash. Atualmente, estou trabalhando na imitação de algoritmo ... portanto, fique atento :)
Peter.O
continuação ... Você precisará ter esses aplicativos instalados .. xdotool xwininfo xmacro zenity sed(mas quem não recebeu o sed :) e, é claro smplayer... Como eu mencionei, minha resposta .. é apenas um 'assistente' .. até agora , mas pensando nisso agora, enquanto escrevo isso, ele pode ser inserido na lista de reprodução normal de smplayer! porque a lista de reprodução será reproduzida de acordo com os arquivos .ini save smplayer (aqueles com nomes de arquivo com hash) .. Isso parece melhor e melhor .. mas eu preciso seriamente de uma pausa :) .. smplayer demais por alguns dias. Ainda tenho que finalizar esse algoritmo de hash
Peter.O 15/05
2

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

Eu trabalhei na perfeição através da playlist ...

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

btw, o diálogo 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 em uma linha (muito perto de final; pouco antes da final return hexhash;)


Adicione este primeiro bloco de linhas imediatamente abaixo dos #includecabeçalhos 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;
}
Peter.O
fonte
1

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

  1. Manual do MPlayer sobre suporte a EDL

  2. Tutorial do MPlayer EDL

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

  4. O projeto sensível do cinema

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

jpc
fonte
Obrigado, no entanto, usando a linha de comando, acho que usar mplayers -ss e -endpos + minhas macros emacs é o melhor caminho a seguir (veja minhas adições à postagem original). O que eu realmente quero é uma boa interface gráfica.
student