시작 및 종료 시간이 포함된 비디오 재생목록

시작 및 종료 시간이 포함된 비디오 재생목록

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

다음에 추가:

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

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

video2.mp4 -ss 112 -endpos 2112

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

추가적으로, 나는 그러한 파일을 약간 더 쉽게 편집할 수 있게 해주는 몇 가지 emacs 기능을 작성했습니다. (-endpos에서 요구하는 대로 시작 및 종료 시간을 hh:mm:ss 형식에서 초로, 종료 시간을 상대 위치(종료 시간 - 시작 시간)로 변환하는 것과 같습니다(관심 있는 사람이 있으면 매크로를 게시할 수 있습니다). 그러나 이는 여전히 너무 불편해서 이 작업을 수행할 수 있는 좋은 GUI가 있는지 질문이 있습니다(예: 비디오 타임라인에서 재생 목록의 시작 및 종료 시간을 표시할 수 있는 등).

답변1

영어가 모국어가 아니어서 잘못된 질문을 하는 것일 수도 있겠지만, 이런 도구로 영상을 편집하면 더 좋지 않을까요?치노이런 재생목록을 만드는 대신?

필요에 따라 시작 시간과 종료 시간을 조정할 수 있는데, 그렇게 어렵지는 않을 것 같아요.

답변2

업데이트-2: 다음 스크립트를 제출한 후 GUI에서 시간 위치를 설정하는 또 다른 방법은 자막 편집기(예: gnome-subtitles)를 사용하는 것임을 갑자기 깨달았습니다. 한 번의 클릭으로 "유령 자막"이 시작하고 끝나는 위치를 표시할 수 있습니다. 실제로 파일 경로와 설명을 "자막"으로 전달할 수 있습니다... 일부 형식은 적합하지 않습니다(예: 프레임 번호 사용).. "ViPlay 자막 " 파일, Power DivX 및 Adobe Encore DVD가 좋아 보입니다.

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

이 정보는 파일 경로가 개별적으로 "재생"되거나 다른 스크립트(내 "재생" 스크립트 또는 Emacs 스크립트와 유사)에 의해 순차적으로 그룹화될 수 있는 구성 파일에 저장됩니다.

작동 방법은 Smplayer의 Seek대화 상자를 활용하는 것입니다... xmacro대화 상자를 조작하는 것입니다(xmacro 명령 사이에 있어야 한다는 것을 알았습니다 sleep .3)... 시간은 HH:MM:SS 형식으로 파일에 저장됩니다 ~/.config/smplayer. 첫 번째 줄은 시작 시간, 두 번째 줄은 종료 시간, 세 번째 줄은 루트 디렉터리를 지정하는 데 사용됩니다... 세 번째 줄은 시작하여 smplayer 구성 설정을 수정하는 후속 스크립트에 의해 선택적 경로 표시기로 사용됩니다. -ss-endpos ... 타임스탬프 프로필은 미디어 파일과 동일하게 이름이 지정되며 접미사는 .smplay...

그래서 원하는 것이 전부는 아니지만, 타이핑 없이 시간만 맞추면 도움이 될 수도 있겠네요...

다음은 "타임스탬프 가져오기" 스크립트입니다.

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

다음 스크립트는 내 원래 "재생" 스크립트입니다. 이는 위의 Timestamp 스크립트와 독립적이지만 함께 작동하는 데 많은 시간이 걸리지 않습니다.

내부적으로 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

답변3

두 번째 답변을 추가했습니다.일반 재생목록처럼 작동합니다.SMPlayer에서는 명확성을 위해 여기가 더 좋습니다...

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

이 방법은 SMPlayer 재컴파일과 특정 파일 명명 방법이 필요합니다. SMPlayer 소스 코드에서 함수 하나만 수정하고, 동일한 소스 파일에 헤더 파일 3개를 추가했습니다. smplayer_0.6.8Maveric과 Lucid에서 사용하는 것으로 컴파일했습니다. 미어캣 smplayer_0.6.9.. 이후 버전에서는 한 줄이 다르지만 별 영향은 없습니다... 수정된 함수와 헤더는 다음과 같습니다.smplayer_0.6.8

그런데 이전 답변의 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;
}

답변4

실제로 재생목록에 적용할 수 있는지는 확인하지 못했지만 편집 결정 목록(EDL)을 확인하실 수 있습니다. 시작하는 데 도움이 되는 몇 가지 링크는 다음과 같습니다.

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

  2. MPlayer EDL 튜토리얼

  3. 명령줄에서 비디오 편집Linux Gazette 기사

  4. 스마트 필름 프로젝트

비디오 사이에 약간의 일시 정지가 있어도 괜찮다면 매번 다른 EDL 파일을 사용하여 스크립트에서 mplayer를 몇 번 실행할 수 있습니다. 일시 중지가 안 되는 경우에는 varrtto가 제안한 것과 같은 새 비디오를 만들어야 할 수도 있습니다.

관련 정보