20秒の長さの動画ファイルがあります。このビデオファイルをこのようにセグメントに切り取りました。
video_file_0 -> starts at 0:00, ends at 0:02
video_file_1 -> starts at 0:02, ends at 0:04
video_file_2 -> starts at 0:04, ends at 0:06
video_file_3 -> starts at 0:06, ends at 0:08
video_file_4 -> starts at 0:08, ends at 0:10
video_file_5 -> starts at 0:10, ends at 0:12
video_file_6 -> starts at 0:12, ends at 0:14
video_file_7 -> starts at 0:14, ends at 0:16
video_file_8 -> starts at 0:16, ends at 0:18
video_file_9 -> starts at 0:18, ends at 0:20
だから私の質問は、ビデオファイルを切り替えるたびにウィンドウを閉じて再開せずにビデオファイル全体を0:00から0:20まで再生するなど、単一のウィンドウでどのようにこれらのビデオファイルを継続的に再生できるかです。これを達成するためにffplay、ffmpeg、またはvlcjを使用できますか?
頑張った
find -type f -name "video_file_*" | while read f; do ffplay -autoexit -- "$f"; done
ただし、このコードは各ビデオファイル間のウィンドウを閉じて再度開きます。これは望ましくありません。どうすればいいですか?
編集:JFrameの内部にストリームが表示されるJavaプロジェクトを構築しています。だから私はこの機能をJFrameの中に表示したいと思います。
答え1
mpv --gapless-audio=yes --loop-playlist=inf video_file_*
シームレス再生を有効にする方法マニュアルに記録されている:
--gapless-audio=<no|yes|weak>
ファイルが変更されたら、無音や中断なしに連続オーディオファイルを再生します。デフォルト:弱い。
no
:スムーズなオーディオを無効にします。
yes
:再生する最初のファイルに対して選択したパラメータでオーディオデバイスを開き、シームレスな再生のために開いたままにします。つまり、最初のファイルのサンプリングレートが低い場合、後続のファイルも同じ低いサンプリングレートで再度サンプリングされ、音質が低下する可能性があります。他のパラメータを使用してファイルを再生する場合は、--audio-samprateや--audio-formatなどのオプションを使用して共有出力形式を明示的に選択することをお勧めします。
weak
:通常、オーディオデバイスは開いたままになります(元の初期化形式を使用)。デコーダから出力されるオーディオフォーマットが変更されると、オーディオデバイスの電源が切れ、再びオンになります。
[...]
に従って:
--loop-playlist=<N|inf|force|no>, --loop-playlist
N回繰り返して再生します。値1は1回再生(デフォルト)、2は2回再生などです。 inf は永遠を意味します。 no 1 と同じで、ループを無効にします。コマンドラインで複数のファイルを指定すると、プレイリスト全体が繰り返されます。
--loop-playlist
同じです--loop-playlist=inf
。
mpv
また、ビデオウィンドウにちらつきが発生しないように注意してください。
長い場合、合理的なプレイリストをvideo_file_*
置き換えることができますが(十分なバリエーションを使用してsort
)、$(printf '%s\n' video_file_* | sort -V)
スペースやその他の文字を処理することはできません。
したがって、find
+を使用すると、xargs
すべての特殊文字に使用できます(まだチョークホールドになる可能性があります)。ユーティリティ車両それ自体)が邪魔になります。端末コントロールはインタラクティブコントロールなので、ここでそれを復元するために人工的に使用されます</dev/tty
。
find -type f -name 'video_file_*' -print0 | sort -V -z | xargs -0 -- sh -c 'exec mpv </dev/tty --gapless-audio=yes --loop-playlist=inf -- "$@"'
注:最新バージョンは再び独自のバージョンにmpv
リダイレクトされました/dev/tty
。
アップデート:別のウィンドウに含めるオプションがmpv
あります。--wid=
したがって、ウィンドウを準備したアプリケーションで作成された場合、アプリケーションはターゲットウィンドウのパラメータを提供するだけです。マニュアルから:
--wid=<ID>
これは、mpvに既存のウィンドウに接続するように指示します。このオプションをサポートするVOを選択すると、ビデオ出力にこのウィンドウが使用されます。 mpvは、そのウィンドウのサイズに合わせてビデオのサイズを変更し、ビデオの縦横比が異なる場合は、それを補うために黒いバーを追加します。
X11では、IDはX11のウィンドウとして解釈されます。
[...]
したがって、X11では、多くのコードなしでxwininfo
ウィンドウのWindow IDを、たとえば次のように検索できます。0xdeadbeef
これはmpv --wid=0xdeadbeef ...
ウィンドウに含めることができます。たとえば、xterm
より高度な用途に使用するには簡単です。含めるライブラリファイル他のプログラムを入力。 X11へのポインタもあります。XReparentWindow(しかし、mpv
そうすることに対する責任は必要です):
- 私が起動した別のプロセスに属するX11ウィンドウを私のウィンドウに含めますか?
- XLib:正しく翻訳されたポップアップでJavaウィンドウを上に再割り当てする(しかし、私が知る限り、OPの目標は反対です)
xdotool
注文がありますwindowreparent
。