複数のオーディオトラックを含むムービーファイルがあります(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 ]、または、この回答でアントニオが提案したように、Gstreamerとさまざまな出力で遊ぶことができます []。
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つの異なるトラックを同時に実行する別のアプローチは、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://:[email protected]:8081/requests/status.xml?command=pl_pause"
詳細 コマンドについて。
その場合、あなたがしなければならないのは、HTTPリクエストを両方のURIに同時に送信するプログラム/スクリプトを作成することだけです。私はそれのために非常に単純なgolangプログラムを書きました(ここに ソースコード があります)。 JSはその目的のためのもう一つの良い候補です。さらに進んで、より多くのコマンドを作成し、そのプログラム/スクリプトにグローバルキーバインディングを割り当てることができます。
アプローチがうまく機能するという要点。