開始時間と終了時間を含むビデオ再生リスト


10

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


@ user5289:Ubuntuの回答だけに興味がある場合(質問でディストリビューションについて言及しなかった場合)、質問するサイトを選択できます。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

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

UPDATE-1; 新しいスクリプト...このスクリプトは統合プレイリスト機能を提供しませんが、Smplayer内で開始時間と終了時間を選択して保存し、変更することができます。何も入力する必要はありません。

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

これは、SmplayerのSeekダイアログを利用して機能します...ダイアログをxmacro操作します(sleep .3xmacroコマンドの間に必要であることがわかりました)...時間はHH:MM:SS形式でファイルに保存され~/.config/smplayerます...最初の行は開始時間、2行目は終了時間、3行目はルートディレクトリを指定するためにあります...この3行目は、smplayer構成設定を変更するfolow-upスクリプトによってオプションのパスインジケーターとして使用されます。-ssandでプライミング-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  

次のスクリプトは、私のオリジナルの「再生」スクリプトです。これは、上記のタイムスタンプスクリプトとは無関係ですが、一緒に動作させるのにそれほど時間はかかりません...

それは「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とは無関係のマクロを使用するため、2番目のダイアログが表示されるまで、何もしないでください(キーボードまたはマウスクリック)。「これは正しいウィンドウですか?」などをチェックし、smplayerの「シークダイアログ」を開くのに1〜2秒かかります。マクロから、HH:MM:SSに表示される現在の時間位置がコピーされます。このダイアログを中断しないでください。 ...
Peter.O、2011年

続き...マクロはタイムスタンプをクリップボードにコピーし、「シークダイアログ」を閉じます。2番目のダイアログが表示されます(「ゼニティ」ダイアログ)... 5つの操作のうち1つを行うように求められます。1)キャプチャしたタイムスタンプを開始位置として使用します。2)取得したタイムスタンプを終了位置として使用します。3)開始位置の設定を解除します。4)終了位置の設定を解除します。5)保存された「構成」ファイルを保持するディレクトリでnautilusを開きます。構成ファイルは、ビデオと同じ名前が付けられています。(名前はSmplayerのタイトルバーから取られます)
Peter.O

続き...そこから、現在のスクリプトで好きなように時間を使用できます...私はSmplayerと統合するスクリプトに取り組んでいます。私の最初のsmplayerスクリプト(私の元の答えに示されています)は少し素朴で、いくつかのオプションでトリップします。Smplayerには、これまでに再生されたすべてのファイルの履歴を保持するオプションがあります。これは、単一のファイルまたは個々のファイルで行うことができます...個々のファイルの方法(デフォルトでは、私が思う(?))が最も適していますが、.ini名はハッシュ化されています。現在、アルゴリズム...
引き続きご注目ください

続きます...これらのアプリをインストールする必要があります.. xdotool xwininfo xmacro zenity sed(sedをまだ取得していない人:)、そしてもちろんsmplayer...私が言ったように、私の答えは..これまでのところ「アシスタント」にすぎません。 、でも今考えてみると、これを書いていると、通常のsmplayerプレイリストに移植することができます!プレイリストは保存smplayer .iniファイル(ハッシュ化されたファイル名を持つファイル)に従って再生されるためです。これは見栄えがよく、より良いです。 。私はまだそのハッシュアルゴリズムを完了する必要があります
Peter.O

2

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

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

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

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

注意 -次のソースセグメントは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;
}

1

これらが本当にプレイリストに適用できるかどうかはわかりませんでしたが、Edit Decision Lists(EDL)を調べてみてください。ここにあなたを始めるためのいくつかのリンクがあります:

  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.