web-dev-qa-db-ja.com

複数の動画を並べて同期する方法

私は3つのビデオを持っています、3つはすべて同じ時間、同じ量のフレームを持っています、そしてそれらはエンコーディング品質の点で異なるだけです。

今、私は評価のために同期して並行して実行する必要があります。 「play」の両方を押したときの意味動画が始まります。停止、前進、後退も同様です。

誰でも可能なプレイヤーを知っていますか?それは私が2つ以上のビデオを並べて再生することを意味します...

プラットフォーム:Win7

35
Grumpy ol' Bear

Windows上のVLC(1.1.10以降):

  • ツール→設定
  • 設定の表示→すべて
  • クリック詳細(クリックプレイリストVLC 2.1.5の場合)
  • 「実行中のインスタンスを1つだけ許可する」のチェックを外します。
  • 「ファイルからの起動時に1つのインスタンス」のチェックを外します

OS X上のVLCは、同じオプションセットを提供しません。ただし、open -a VLCを使用してターミナルから複数のインスタンスを実行できます。

10
Kiran

まだ誰かがこれに興味を持っているならば、VLCの現在のバージョンはどんな種類のスクリプトもアドオンもなしで非常にうまくこれをすることができます。私の知る限りでは、あなたは3つではなく、2つのファイルを同期して再生することしかできません。

  1. これを実現するには、単純にVLCを開き、 Media> Open Multiple Files を選択します。
  2. 複数ファイルウィンドウの中で追加を選択して最初のファイルを追加します。
  3. この後、[他のオプションを表示、]チェックボックスをクリックし、続いて[他のメディアを同期して再生する]チェックボックスをオンにします。ウィンドウの.
  4. 2番目のファイルを追加するには、[追加メディア]の横にある参照を選択します。
  5. ヒットプレイと2つのメディアファイルが1つのコントロールウィンドウで同時に再生されます。
29
Tim L

Bino は、立体ファイルの再生に一般的に推奨されているクロスプラットフォームのメディアプレーヤーです。他の機能の中でも、それは複数のストリームの同期再生をサポートしています。

インターフェースは最初は少し原始的または混乱を招くように思えるかもしれませんが、あなたがする必要があるのはただです。

  1. 2つのビデオファイルをBinoにドラッグします
  2. 「最初のストリームを左に」入力オプション、「左/右」出力オプションを選択

あなたは同期再生を得ました。 1セットの再生コントロールがすべてのストリームに使用されるので、「いくつかの指の太さに投資して、すばやくクリックできるように自分自身を訓練する」 .speot.isが示唆している。

ボーナスとして、それはアナグリフ3Dのレンダリングをサポートします。

17
o.v.

Kiranが言ったことをした後、あなたのビデオをすべて開き、次のAutoHotKeyスクリプトを実行してください。

ScriptVersion = 1.1
#Singleinstance,force

GoSub, MainProgram
return

mainprogram:
    SetTitleMatchMode, 2
    WinGet, id, list, - VLC media player,, Program Manager
    Windows = 
    Loop, %id%
    {
        StringTrimRight, this_id, id%a_index%, 0
        Windows := this_id . "," . Windows
    }
    StringTrimRight, Windows, Windows, 1

    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
    SendMode Input ; Recommended for new scripts due to its superior speed and reliability.

    ~]::LoopControlSend(Windows, "]")
    ~[::LoopControlSend(Windows, "[")
    ~j::LoopControlSend(Windows, "j")
    ~k::LoopControlSend(Windows, "k")
    ~space::LoopControlSend(Windows, "{space}")

    ~+left::LoopControlSend(Windows, "+{left}")
    ~!left::LoopControlSend(Windows, "!{left}")
    ~^left::LoopControlSend(Windows, "^{left}")
    ~+right::LoopControlSend(Windows, "+{right}")
    ~!right::LoopControlSend(Windows, "!{right}")
    ~^right::LoopControlSend(Windows, "^{right}")
    ~^up::LoopControlSend(Windows, "^{up}")
    ~^down::LoopControlSend(Windows, "^{down}")

    ; for active windows only. use this to adjust speed when out of sync
    ~left::ActiveWindowSend(Windows, "+{left}")
    ~right::ActiveWindowSend(Windows, "+{right}")
    ~up::ActiveWindowSend(Windows, "^{left}")
    ~down::ActiveWindowSend(Windows, "^{right}")
return

LoopControlSend(Windows, x)
{
    WinGet, active_id, ID, A

    is_valid_window = 0
    Loop,Parse,Windows,CSV
    {
        if active_id = %A_LoopField%
        {
            is_valid_window = 1
            break
        }
    }

    if is_valid_window
    {
        Loop,Parse,Windows,CSV
        {
            if active_id <> %A_LoopField%
            {
                ControlSend, , %x%, Ahk_Id %A_LoopField%
            }
        }
    }
}

ActiveWindowSend(Windows, x)
{
    WinGet, active_id, ID, A

    is_valid_window = 0
    Loop,Parse,Windows,CSV
    {
        if active_id = %A_LoopField%
        {
            is_valid_window = 1
            break
        }
    }

    if is_valid_window
    {
        SendInput, %x%
    }
}

このスクリプトはあなたのキーストロークをVLCメディアプレイヤーの全ての実行中のインスタンスに送ります。マウスを使ってもうまくいきません。

これらはうまくいくはずです。

  • forward:Ctrl + right / Alt + right / Shift + right
  • 後方:Ctrl + left / Alt + left / Shift + left
  • 再生/一時停止:spacename__
  • スピードアップ:]
  • スピードダウン:[

あなたは簡単に行の下に他のキーストロークを追加することができます:~^down::LoopControlSend(Windows, "^{down}")

これはビデオを完全に同期させるわけではないので、次の4つのキーを使用できます。left, right, up, downアクティブウィンドウのみを制御する

  • leftname__非常に短い逆方向ジャンプ
  • rightname__非常に短い順方向ジャンプ
  • upname__ミディアムバックワードジャンプ
  • downname__ミディアムフォワードジャンプ

プログラムを手動で選択したい場合は、代わりに次のコードを使用してください。

;Modified from MultipleSend by jgpaiva

ScriptVersion = 1.1
#Singleinstance,force

GoSub, MainProgram
return

Guiescape:
GuiClose:
    gui,destroy
    exitapp  

mainprogram:
    ;start by populating the listview.
    Gui, 1:default
    Gui, Add, Text, ,Select the windows to send the text.`nSelect several by pressing ctrl while selecting.`nAfter you've finished the selection`, press Submit.
    Gui, Add, ListView,w400 h500 vMyListView, Name of the Window | Window Class |Window ID
    WinGet, id, list,,, Program Manager
    Loop, %id%
    {
        StringTrimRight, this_id, id%a_index%, 0
        WinGetClass, this_class, ahk_id %this_id%
        WinGetTitle, this_title, ahk_id %this_id%
        If This_Title =
            continue
        if % LV_Add("",This_Title,This_Class,This_ID) = 0
            msgbox, bug
    } 
    Gui, Add, Button, default,Submit
    Gui,  Show
return

ButtonSubmit:
    NextRow := -1
    Windows =
    Loop,% LV_GetCount("Selected")
    {
    NextRow:=LV_GetNext(NextRow)
    LV_GetText(Text, NextRow,3)
    Windows := Text . "," . Windows
    }
    StringTrimRight, Windows, Windows, 1
    Gui,1:Destroy

    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
    SendMode Input ; Recommended for new scripts due to its superior speed and reliability.

    ~]::LoopControlSend(Windows, "]")
    ~[::LoopControlSend(Windows, "[")
    ~j::LoopControlSend(Windows, "j")
    ~k::LoopControlSend(Windows, "k")
    ~space::LoopControlSend(Windows, "{space}")

    ~+left::LoopControlSend(Windows, "+{left}")
    ~!left::LoopControlSend(Windows, "!{left}")
    ~^left::LoopControlSend(Windows, "^{left}")
    ~+right::LoopControlSend(Windows, "+{right}")
    ~!right::LoopControlSend(Windows, "!{right}")
    ~^right::LoopControlSend(Windows, "^{right}")

    ~^up::LoopControlSend(Windows, "^{up}")
    ~^down::LoopControlSend(Windows, "^{down}")

    ; for active windows only. use this to adjust speed when out of sync
    ~left::ActiveWindowSend(Windows, "+{left}")
    ~right::ActiveWindowSend(Windows, "+{right}")
    ~up::ActiveWindowSend(Windows, "^{left}")
    ~down::ActiveWindowSend(Windows, "^{right}")
return

LoopControlSend(Windows, x)
{
    WinGet, active_id, ID, A

    is_valid_window = 0
    Loop,Parse,Windows,CSV
    {
        if active_id = %A_LoopField%
        {
            is_valid_window = 1
            break
        }
    }

    if is_valid_window
    {
        Loop,Parse,Windows,CSV
        {
            if active_id <> %A_LoopField%
            {
                ControlSend, , %x%, Ahk_Id %A_LoopField%
            }
        }
    }
}

ActiveWindowSend(Windows, x)
{
    WinGet, active_id, ID, A

    is_valid_window = 0
    Loop,Parse,Windows,CSV
    {
        if active_id = %A_LoopField%
        {
            is_valid_window = 1
            break
        }
    }

    if is_valid_window
    {
        SendInput, %x%
    }
}
4
user52874

コマンドラインを使用しても構わない場合は、 mpv を使用してこれを実行できます。

3つの動画を並べて(横に並べて)

enter image description here

mpv --lavfi-complex="[vid1][vid2][vid3]hstack=inputs=3[vo];[aid1][aid2][aid3]amix=inputs=3[ao]" input1.mkv --external-files="input2.mkv;input3.mkv"

2ビデオ

mpv --lavfi-complex="[vid1][vid2]hstack[vo];[aid1][aid2]amix[ao]" input1.mkv --external-file=input2.mkv

ノート

  • Windowsでは、;を使用して各ファイル名を--external-filesで区切ります(3つの動画の例に示すとおり)。 LinuxとmacOSでは:を使います。あるいは、--external-fileのように、代わりに--external-file=input2.mkv --external-file=input3.mkvの2つのインスタンスを使用します。

  • ファイルはすべて同じ高さでなければなりません。そうでない場合は、スケール、パッド、クロップフィルターを追加してください。詳細については、 mpvのドキュメントFFmpegフィルタ を参照してください。

4
llogan

グーグルはおそらくすでにあなたに言った、あなたはそれをすることができるカップルプロプライエタリなソフトウェアを買うことができる、しかし念のために:ビデオカム、tmpgenc、vidlord ...

これは無料です: http://forum.Doom9.org/showthread.php?t=138430

(スレッドの最後に作業ダウンロードリンク)

私のワインのセットアップは今完全にねじ止めされているのでテストされていません。並べて再生するのではなく、スタック再生を行います(非常に優れた液晶ディスプレイがない限り、画面の反対側の2つのコーナーで同じビデオを再生しても同じものは表示されません)。

あなたが本当に並んでいる必要があると思うなら、あなたはジマーが言ったことをするためにavisynthを使うことができます。

clip1 = DirectShowSource("C:\MyEncode1.foo", audio=false)
clip2 = DirectShowSource("C:\MyEncode2.foo", audio=false)
StackVertical(clip1,clip2)

(forum.Doom9.org/showthread.php?t = 139769を参照)

エンコードを行う必要はありません(とにかく独自のエンコードアーティファクトを追加します)。2つのvidをまとめてエンコードしてファイルをスキップするようなプロジェクトを作成するだけです。

3
user36755

私は同じ問題を抱えていますが、今のところ満足できる解決策をオンラインで見たことがありません(そして私は徹底的な調査をしたと私は信じます)。ついに私は余分な$を必要としない私自身の解決策を思い付きます。これは古い質問ですが、私の回避策がまだ役立つことを願っています。

まず、VLCプレーヤーで、[ツール] - > [設定]に進みます。 [実行中のインスタンスを1つだけ許可する]と[ビデオの最後のフレームで一時停止する]のチェックを外してください。

次に、テキストファイルに次のコマンドを入力/編集します。 Windowsのコマンドプロンプトを開き、コピー&ペーストでコマンドを実行します(またはテキストを保存してバッチファイルとして実行します)。

set VLCplayer="C:\Program Files (x86)\VideoLAN\VLC\vlc.exe"
set VLCoptions=--repeat
set VIDEOdir="D:\path to your video directory"
set Video1="calibration1.mj2"
set Video2="calibration2.mj2"
set Video3="calibration3.mj2"

REM check the commands for misplaced spaces or missing '/' or '"' before running
ECHO cd %VIDEOdir%
ECHO %VLCplayer% %VLCoptions% %Video1%
ECHO %VLCplayer% %VLCoptions% %Video2%
ECHO %VLCplayer% %VLCoptions% %Video3%

cd %VIDEOdir%
%VLCplayer% %VLCoptions% %Video1%
%VLCplayer% %VLCoptions% %Video2%
%VLCplayer% %VLCoptions% %Video3%

これにより3つのVLCインスタンスが開かれ、それぞれ3つのビデオのうちの1つが含まれ、すべてが非常に同期した方法で再生されます。ただし、3つのインスタンスは最初は互いに重複しています。あなたはそれらがあなたのスクリーン上で並んで再生されるのを見ることができるように再生を中断することなくそれらを動かすために各インスタンスのタイトルバーをクリックする必要があるでしょう。これはやや面倒ですが、私はそれを非常に小さい不便だと思います。

私は試したことがありますが、停止、前進、後退などのホットキーですべてのインスタンスを制御することはできません。ただし、オプション '--repeat'を指定するとビデオがループします。 。

非常に長いビデオの場合は、サイドバイサイドコンポジションのビデオを1つのビデオにマージするのが最善の方法です。 ffmpeg: https://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015662.html および http://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015712.html このコマンドは2つのビデオをマージする方法を説明しているだけですが、私は信じています(つまり私はテストしていません)。それはあなたが複数のビデオファイルを組み込むためにコマンドを複数回実行することができます。

3
wtong

AutoHotKeyスクリプトを使用して、3人のプレイヤー全員に "Play"ショートカットを短時間で送信できることをイメージしています。

彼らがまったく同時にプレイを開始できるかどうかは別の問題です。たとえ彼らがすぐに始めることができたとしても、私はハードドライブのためにいくらかの戦いがあるだろうと思います。これが重要な評価である場合はRAMディスクを作成することをお勧めします。

1
ta.speot.is