시작 및 종료 시간이있는 비디오 재생 목록


10

목록에있는 각 비디오의 시작 및 중지 시간이 다른 재생 목록 (비디오 파일의 경우)을 만들고 편집 할 수있는 Linux 용 좋은 GUI 응용 프로그램 (예 : mplayer GUI 또는 밴시와 같은 것)이 있습니까?

추가 :

현재 다음과 같은 내용을 포함하는 수동 파일을 만듭니다.

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

video2.mp4 -ss 112 -endpos 2112

그런 다음 래퍼 스크립트가 있습니다. mplayer -fs $(grep -v "^ #" $1)

또한 이러한 파일의 편집을 약간 단순화하는 일부 emacs 기능을 작성했습니다. (시작 및 종료 시간을 hh : mm : ss 형식에서 초로 변환하고 종료 시간을 -endpos에 필요한 상대 위치 (종료 시간-시작 시간)로 변환하는 것처럼 (누군가 관심이 있으면 매크로를 게시 할 수 있음) 여전히 불편합니다. 따라서 내 질문은이 작업을 수행하기위한 멋진 GUI가 있는지 여부입니다 (예 : 비디오 타임 라인에서 재생 목록의 시작 및 종료 시간 등을 표시 할 수 있음).


@ user5289 : Ubuntu에 대한 답변에만 관심이 있다면 (질문에 대한 배포는 언급하지 않았 음), 어떤 사이트를 요청할지 선택할 수 있습니다. Ask Ubuntu를 선호하는 경우 flag질문에 있는 버튼을 사용하여 마이그레이션을 요청하십시오.
Gilles 'SO- 악마 그만

1
@ user5289 GUI에서 비디오를 재생할 수 있기를 원하십니까? ( 'mplayer'는 확실히 GUI가 아니기 때문에)? ... 또는 GUI에서 시간 위치를 설정할 수 있습니까? .. Smplayer를 사용하여 기존의 "시간이 지정된 명령"을 사용할 수 있기 때문에 .. 그 작업을 수행하기 위해 스크립트를 작성했습니다. 스크립트를 게시하고 응답합니다. 당신의 방법이 흥미 롭다는 것을 발견했습니다. 그리고 나는 그것을 Smplayer에 적응 시켰습니다.
Peter.O

@ fred.bear, 예, 요점은 GUI에서 시간 위치를 설정하고 GUI에서 전체 재생 목록을 편안한 방식으로 편집하고 싶다는 것입니다. (GUI에서 플레이하는 것은 중요하지 않습니다)
학생

@ user5289 : 내가 새로운 추가했습니다 .... 내가 Smplayer 함께 할 ...는 GUI의 시간 위치를 설정하는 것은 매우 수 있습니다 timestamps만 보여 내 원래의 대답에 스크립트를 play-it-in-Smplayer스크립트
Peter.O

답변:


3

영어가 모국어가 아니기 때문에 질문이 잘못되었을 수도 있지만 Kino 와 같은 도구로 비디오를 편집하여 재생 목록을 만드는 대신 더 나은 방법 이 아닐까요?

원하는대로 시작 및 중지 시간을 조정할 수 있으며 그렇게 힘들지는 않다고 생각합니다.


2
예, Kino 등을 사용하여 비디오를 자르는 방법을 알고 있습니다. 문제는 실제로 새 동영상을 만드는 것이 아니라 재생 목록에 관한 것입니다. 이러한 재생 목록을 만드는 것은 매우 빠르고 유연하며 추가 디스크 공간을 소비하지 않습니다.
학생

3

업데이트 2 : 다음 스크립트를 제출 한 후 GUI에서 시간 위치를 설정하는 또 다른 방법은 자막 편집기 (예 :)를 사용하는 것 gnome-subtitles입니다. "팬텀 자막"의 시작과 끝 위치를 클릭하여 표시 할 수 있습니다. 실제로 파일 경로와 주석을 "자막"으로 넣을 수 있습니다. 일부 형식이 적합하지 않습니다 (예 : 프레임 번호 사용). 'ViPlay Subtitle File', Power DivX 및 'Adobe Encore DVD'모양 좋은.

업데이트 -1; 새 스크립트 ...이 스크립트는 통합 재생 목록 기능을 제공하지 않지만 아무 것도 입력하지 않아도 Smplayer에서 시작 및 종료 시간을 선택하고 저장하고 수정할 수 있습니다.

이 정보는 설정 파일에 저장되는데, 파일 경로는 다른 스크립트 (내 'play'스크립트와 유사하거나 Emacs 스크립트와 유사)를 통해 개별적으로 또는 순서대로 그룹화 될 수 있습니다.

그것은 Smplayer의 Seek대화 상자 를 사용하여 작동합니다 ... 대화 상자를 xmacro조작합니다 ( sleep .3xmacro 명령 사이에 필요하다는 것을 알았습니다) ... 시간은 파일에 HH : MM : SS 형식으로 저장됩니다 ~/.config/smplayer... 첫 번째 줄은 시작 시간, 두 번째 줄은 종료 시간이고 세 번째 줄은 루트 디렉토리를 지정하기위한 것입니다 ...이 세 번째 줄은 다음과 같이 smplayer 구성 설정을 수정하는 folow-up 스크립트에 의한 선택적 경로 표시기로 사용됩니다 로 프라이밍 -ss하고 -endpos... 타임 스탬프 설정 파일은 함께, 미디어 파일과 동일한 이름 .smplay접미사 ...

따라서 이것은 원하는 것이 아니지만 입력하지 않고 시간을 설정하는 데 도움이 될 수 있습니다 ...

'get timestamp'스크립트는 다음과 같습니다.

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

다음 스크립트는 원래 '플레이'스크립트이며 avove 타임 스탬프 스크립트와는 독립적이지만 함께 작동하는 데 많은 시간이 걸리지 않습니다 ...

mplayer를 내부적으로 사용하는 'Smplayer'를 구동 할 것입니다. 최소한 일반 GUI이지만 재생 목록은 텍스트 편집기에 있어야합니다. 이미 그 방법에 대해 알고있을 것입니다. :)

나는 몇 년 전에 이것을 시도했지만 자주 그런 일이 필요하지 않기 때문에 그것에 대해 모든 것을 잊어 버렸지 만 "책갈피"를 유지하는 것이 좋습니다. 아이디어를 부활 시켜서 기쁩니다. 스크립트는 다음과 같습니다. 실제로 수행 한 것과 동일하지만 Smplayer (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

업데이트 해 주셔서 감사합니다. 스크립트를 사용하는 방법을 단계별로 추가 할 수 있습니까?
학생

@ user5289. 동영상에 smplayer가 열려 있어야하며 스크립트는 단축키 (xbindkeys를 사용하지만 어떤 것이 든 상관 없음)와 연결되어 있어야합니다. 그런 다음 영화의 어느 시점에서나 단축키를 누르면됩니다. -key .. smplayer와 관련이없는 매크로를 사용하므로 두 번째 대화 상자가 나타날 때까지 아무 것도하지 마십시오 (키보드 또는 마우스 클릭). "이것이 올바른 창입니까?"등을 확인하고 매크로가 HH : MM : SS에 표시된 현재 시간 위치를 복사하는 smplayer의 "검색 대화 상자"를 여는 데 1-2 초가 걸립니다.이 대화 상자를 중단하지 마십시오. ...
Peter.O

계속 ... 매크로가 타임 스탬프를 클립 보드에 복사 한 다음 "검색 대화 상자"를 닫습니다. 두 번째 대화 상자 ( "정수"대화 상자)가 나타납니다. 5 가지 중 하나를 수행하라는 메시지가 표시됩니다. 1) 캡처 한 타임 스탬프를 시작 위치로 사용하십시오. 2) 캡처 된 타임 스탬프를 종료 위치로 사용하십시오. 3) 시작 위치를 설정 해제하십시오. 4) 끝 위치를 설정 해제하십시오. 5) 저장된 "config"파일이있는 디렉토리에서 nautilus를 엽니 다. 구성 파일의 이름은 비디오와 동일합니다. (이름은 Smplayer의 제목 표시 줄에서 가져옵니다.)
Peter.O

계속 ... 현재 스크립트에서 원하는대로 시간을 사용할 수 있습니다. 저는 Smplayer와 통합 된 스크립트를 작성하고 있습니다. 첫 번째 smplayer 스크립트 (원래 답변으로 표시됨)는 약간 순진하며 일부 옵션으로 넘어갑니다. Smplayer에는 재생 된 모든 파일의 기록을 유지할 수있는 옵션이 있습니다. 이것은 하나의 파일 또는 개별 파일로 수행 할 수 있습니다 ... 개별 파일 방법 (기본적으로, 생각합니다 (?)이 가장 적합하지만 .ini 이름은 해시됩니다. 현재는 다음과 같은 모방 작업을하고 있습니다. 알고리즘 ... 계속 지켜봐 주시기 바랍니다 :)
Peter.O

계속 ... 당신은 이러한 응용 프로그램을 설치해야합니다 .. xdotool xwininfo xmacro zenity sed(하지만 누가 sed되지 않은 :), 물론 smplayer... 내가 대답을 언급했듯이 .. 그것은 단지 '지원'.. 지금까지 , 그러나 지금 생각하면, 이것을 쓰면서 일반적인 smplayer 재생 목록에 접목 시킬 수 있습니다! 재생 목록은 smplayer .ini 파일 저장 (해시 된 파일 이름이있는 파일)에 따라 재생되기 때문입니다.이 파일은 더 낫고 좋아 보입니다. 그러나 쉼표가 필요합니다. 나는 아직도 그 해싱 알고리즘을 끝내야합니다
Peter.O

2

SMPlayer에서 일반 재생 목록 으로 작동 하기 때문에이 두 번째 대답을 추가 했으며 명확성을 위해 여기에 더 좋습니다.

재생 목록을 통해 완벽하게 작동했습니다 ...

이 방법을 사용하려면 SMPlayer를 다시 컴파일해야하고 특정 파일 이름 지정 방법이 필요합니다. SMPlayer의 소스에서 하나의 함수 만 수정되고 동일한 단일 소스 파일에 3 개의 헤더가 추가됩니다. 나는 smplayer_0.6.8Lucid를 위해 컴파일 했습니다. Maveric과 Meerkat 사용 smplayer_0.6.9.. 이후 버전의 한 줄은 다르지만 아무 것도 화 나지 않습니다 ... 여기에 대한 수정 된 함수와 헤더가 있습니다.smplayer_0.6.8

btw, 이전 답변의 zenity 대화 상자는 여전히 시작 및 종료 시간을 캡처하는 데 사용됩니다 ...

알림 -다음 소스 세그먼트는 다음과 같습니다. smplayer_0.6.8수정할 파일 은 다음과 같습니다 . ../smplayer-0.6.9/src/findsubtitles/osparser.cpp... '0.6.8'및 '0.6.9'에 대해 새 세그먼트는 동일하지만 원본은 한 줄씩 다릅니다. 끝; 마지막 직전 return hexhash;)


기존 #include헤더 바로 아래에 첫 번째 라인 블록을 추가하십시오.

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

수정 된 기능은 다음과 같습니다.

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;
}

1

재생 목록에 실제로 적용 할 수 있는지 확인하지 못했지만 EDL (Edit Decision List)을 살펴볼 수 있습니다. 다음은 시작할 수있는 몇 가지 링크입니다.

  1. EDL 지원에 관한 MPlayer 매뉴얼

  2. MPlayer EDL 튜토리얼

  3. 커맨드 라인 LinuxGazette 기사 에서 비디오 편집

  4. 현명한 영화 프로젝트

비디오 사이의 작은 일시 중지를 신경 쓰지 않으면 매번 다른 EDL 파일이있는 스크립트에서 mplayer를 여러 번 실행할 수 있습니다. 일시 중지가 아니오 인 경우 varrtto가 제안한 것처럼 새 동영상을 만들어야합니다.


그러나 명령 줄을 사용하여 mplayers -ss 및 -endpos + 내 emacs 매크로를 사용하는 것이 더 좋은 방법이라고 생각합니다 (원래 게시물에 대한 추가 내용 참조). 내가 정말로 원하는 것은 멋진 GUI입니다.
학생
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.