Ffmpegを使用して、さまざまなビデオからさまざまなセグメントを取得する1つのビデオを作成できますか?
1.webm, 2.webm, 3.webm, 4.webm
これらは私の4つのビデオファイルです。各ビデオから10秒が欲しいです。セグメントは私が指定します。
ffmpeg -i 1.webm -1 2.webm -i 3.webm -i 4.webm -ss 00:00:00 -t 10 -ss 00:00:10 \
-t 10 -ss 00:00:20 -t 10 -ss 00:00:30 -t 10;
上記は実際に機能するコマンドではありません。プログラムでこのようなものを入手できますか?
1つのコマンドでこれを行うことはできません。ただし、Linuxで実行していて、シェルとしてBash(または同様のもの)を使用していると仮定すると、必要なのは2つのコマンドだけです。これは、すべてのビデオにexact同じビデオおよびオーディオコーデックとタイムベース(fpsなど)がある場合にのみ機能することに注意してください。
まず、以下を含む編集リストを作成する必要があります。それをvideos
と呼びましょう:
1.webm 00:00:00
2.webm 00:00:10
3.webm 00:00:20
これはスペース付きのビデオ名をサポートしないことに注意してください。
次に、小さいビデオを保持するための一時フォルダーを作成します。それをtmp
と呼びましょう。次に、次のようにファイルを分割できます。
while read video time; do ffmpeg -i $video -ss $time -t 10 -c copy tmp/$video; done < videos
ここで、-t 10
は、-ss
で定義されたタイムスタンプから開始してビデオから10秒をカットすることを意味します。 -to
の代わりに-t
を使用して、特定のポイントをカットすることもできますntil。
入力ビデオのビデオコーデックとオーディオコーデックがすべて異なる場合は、この時点でビデオを再エンコードする必要があります。このためには、-c copy
部分を特定のビデオおよびオーディオコーデック設定に置き換える必要があります。 -c:v libx264 -c:a libfaac
H.264/AACビデオおよびオーディオ用。
ここで、 concat
プロトコル を使用して、ファイルをマージして戻すことができます。
ffmpeg -f concat -i <(for f in tmp/*.webm; do echo "file '$f'"; done) -c copy output.webm
必要なのはこれだけです。これは、連結ファイルをその場で動的に作成することによって機能します。それ以外の場合は、 concat
ドキュメント に従って手動で作成する必要があります。
最後に、tmp
フォルダーをクリーンアップできます。