web-dev-qa-db-ja.com

開始時間と終了時間のあるビデオ再生リスト

リストの各ビデオの開始時間と停止時間が異なるプレイリスト(ビデオファイル用)を作成および編集できる、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関数を作成しました。 (開始時刻と終了時刻をhh:mm:ss形式から秒に変換し、終了時刻を相対位置(e​​ndtime-starttime)に変換するのと同じように、-endposで要求されます(誰かが興味を持っている場合はマクロを投稿できます)。ただし、それでも不快です。だから私の質問は、これを行うための素晴らしいGUIがあるかどうかです(たとえば、ビデオタイムラインでプレイリストの開始時間と終了時間をマークすることができます)。

10
student

UPDATE-2:次のスクリプトを送信した後、(GUIで)時間位置を設定する別の方法は字幕エディター(例:gnome-subtitles)を使用することであることに気づきました。クリックするだけで、「ファントム字幕」の開始位置と終了位置をマークできます。実際には、ファイルパスとコメントを「字幕」として入力できます...一部の形式は適切ではありません(フレーム番号の使用など)。「ViPlay字幕ファイル」、Power DivX、および「AdobeEncoreDVD」の外観良い。

UPDATE-1;新しいスクリプト...このスクリプトでは、統合されたプレイリスト機能は提供されませんが、何も入力しなくても、Smplayer内で開始時刻と終了時刻を選択、保存、および変更できます。

この情報は設定ファイルに保存され、そのファイルパスは別のスクリプト(私の「play」スクリプトと同様、またはEmacsスクリプトと同様)を介して、個別に「再生」するか、順番にグループ化することができます。

SmplayerのSeekダイアログを利用して機能します...xmacroはダイアログを操作します(xmacroコマンドの間にsleep .3が必要であることがわかりました)...時間はHHに保存されます~/.config/smplayer...のファイルの:MM:SS形式1行目は開始時刻、2行目は終了時刻、3行目はルートディレクトリを指定するためのものです...これ3行目は、-ssおよび-endpos...でプライミングすることによってsmplayer構成設定を変更するフォローアップスクリプトによってオプションのパスインジケーターとして使用されます。タイムスタンプ構成ファイルの名前はメディアと同じです。 .smplayサフィックスが付いたファイル..

だから、これはあなたが望むすべてではありませんが、入力せずに時間を設定するのに役立つかもしれません...

'gettimestamps'スクリプトは次のとおりです。

#!/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
Peter.O

英語は私の母国語ではないので、質問が間違っているかもしれませんが、そのようなプレイリストを作成する代わりに、Kinoのようなツールでビデオを編集した方が良いのではないでしょうか。

開始時間と停止時間は自由に調整できますが、それほど難しいことではないと思います。

3
varrtto

SMPlayerでは通常のプレイリストとして機能しますであるため、この2番目の回答を追加しました。わかりやすくするためにここの方が良いです...

プレイリストを介して問題なく動作しました...

この方法では、SMPlayerの再コンパイルと、特定のファイル命名方法が必要です... SMPlayerのソース内の1つの関数のみが変更され、3つのヘッダーが同じ単一のソースファイルに追加されます... Lucid用にsmplayer_0.6.8をコンパイルしました。 ..MavericとMeerkatはsmplayer_0.6.9を使用します。.後のバージョンの1行は異なりますが、それは何も混乱させません...これがsmplayer_0.6.8の変更された関数とヘッダーです。

ところで、私の前の答えの天頂ダイアログは、開始時間と終了時間をキャプチャするためにまだ使用されています...

[〜#〜] reminder [〜#〜]-次のソースセグメントはsmplayer_0.6.8...用です。変更するファイルは次のとおりです。../smplayer-0.6.9/src/findsubtitles/osparser.cpp...新しいセグメントは '0.6.8でも同じです。 'と' 0.6.9 'ですが、元の行は1行異なります(最後に非常に近く、最後の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;
}
2
Peter.O

これらが実際にプレイリストに適用できるかどうかはわかりませんでしたが、編集決定リスト(EDL)を調べることができます。開始するためのリンクは次のとおりです。

  1. EDLサポートに関するMPlayerマニュアル

  2. MPlayer EDLチュートリアル

  3. コマンドラインからのビデオ編集 LinuxGazetteの記事

  4. 賢明な映画プロジェクト

ビデオ間の小さな一時停止を気にしない場合は、毎回異なるEDLファイルを使用してスクリプトからmplayerを数回実行するだけで済みます。一時停止がノーノーの場合は、varrttoが提案したように新しいビデオを作成する必要があります。

1
jpc