(MKVコンテナー内に)複数のオーディオトラックを含むムービーファイルがあります。ある言語をスピーカー(子供用)に、別の言語をヘッドフォン(私用)に送信し、映画が一時停止した場合でもトラックの同期を保ちながら映画を観たい。
私のシステムにはすでに2つのオーディオ出力が適切に構成されていると仮定します。
Linuxのメディアプレーヤーでこれを行う方法はありますか?これまでにMPlayerとVLCを確認しましたが、サポートされているのは使用可能なオーディオトラックの1つだけです。
:-)
(MKVコンテナー内に)複数のオーディオトラックを含むムービーファイルがあります。ある言語をスピーカー(子供用)に、別の言語をヘッドフォン(私用)に送信し、映画が一時停止した場合でもトラックの同期を保ちながら映画を観たい。
私のシステムにはすでに2つのオーディオ出力が適切に構成されていると仮定します。
Linuxのメディアプレーヤーでこれを行う方法はありますか?これまでにMPlayerとVLCを確認しましたが、サポートされているのは使用可能なオーディオトラックの1つだけです。
:-)
回答:
別名[ バタフライ ]をホイールで破る方法 [ フライ ]。
たとえば、を使用して、すべてのオーディオトラックと字幕トラックを含むムービー全体をローカルにストリーミングできますvlc
。
次に、2つのクライアントをそのストリームに接続し、言語(および/または字幕)と別のオーディオ出力(既に構成済みであると想定)を選択することで「十分」になります。
さらに、新しいテレビ、タブレット、または携帯電話では、コンピューターでクライアントを実行する必要はありません...そして、ストリーマーを一時停止にすると、一時停止すべてに入れます...そして、ウィンドウでも動作するはずです(常に想定されています)コンピューターで2つのクライアントを実行したい場合は、オーディオ出力はおそらくサードパーティのプログラムで構成されています)。
典型的なストリーミングコマンドラインは次のようになります。
vlc "movie.mkv" --sout-all --sout="#rtp{dst=239.255.100.100,port=5004,mux=ts}"
オプションが必要です--sout-all
[ SO ]
--sout-all, --no-sout-all Enable streaming of all ES (default disabled) Stream all elementary streams (video, audio and subtitles) (default disabled)
vlc -H
他の(トンの)オプションを利用できるようにするためのヒントを読むために読んでください。
ストリームを「再生」するには
vlc rtp://239.255.100.100:5004 --audio-track=x
xは、そのクライアントでリッスンするオーディオストリームの番号です。
すべてはサーバー/クライアントGUIからも簡単に実行できます...
参考資料とその他の参考資料
Luukのブログページ「VLCを使用して複数のコンピューターで複数のビデオクリップを同期して再生する」 [ 1 ]から詳細を読むことをお勧めします。最終的には、videolanのこのWikiページから外部オーディオトラックを追加してみることができます[ 2 ]、または、Antonioがこの回答で提案したように、Gstreamerやさまざまな出力で遊ぶことができます[ 3 ]。
GStreamer:
#トラックの数と順序がわかっている必要があります…
gst-launch-1.0 \
filesrc location=example.mkv ! decodebin name=decoded \
decoded.src_0 ! queue ! autovideosink \
decoded.src_1 ! queue ! audioconvert ! alsasink device=”hw:1,0″ \
decoded.src_2 ! queue ! audioconvert ! alsasink device=”hw:2,0″
上記のGstreamerコマンドは、それ自体で最小限の有効な答えになるか、または(バター)フライを保存するためのパスになる可能性
があります... ...しかし、自分のニックネームを守ろうとはしません。
ストリーミングソリューションには欠点があります。クライアントはキャッシュを使用するため、同期が取れなくなる可能性があります。それは私に起こりました。
2つの異なるトラックを同時に実行するもう1つの方法は、VLCの2つのインスタンスを実行し、それらの再生を同期することです。しかし、私は自動化なしでは適切に実行できません(手動のアクションが1つずつ行われ、遅延が発生します)。
解決策は、Webインターフェイスを使用して両方のVLCインスタンスを同期的に制御することです。GUIまたはコンソールから有効にできます。
vlc --extraintf=http --http-host 127.0.0.1 --http-port 8081 --http-password any_password
VLCインスタンスごとに異なるポートを使用します。再生を制御するには、1つのコマンドで十分です-一時停止トグル:
http://:any_password@127.0.0.1:8081/requests/status.xml?command=pl_pause"
コマンドの詳細。
その場合は、HTTPリクエストを両方のURIに同時に送信するプログラム/スクリプトを作成するだけです。私はそれのために非常に単純なgolangプログラムを書きました(ここにソースコードがあります)。JSはその目的のためのもう1つの良い候補です。さらに進んで、より多くのコマンドを作成し、そのプログラム/スクリプトにグローバルキーバインディングを割り当てることができます。
アプローチがうまく機能する主なポイント。