web-dev-qa-db-ja.com

異なるビデオのセグメントをマージするffmpeg

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;

上記は実際に機能するコマンドではありません。プログラムでこのようなものを入手できますか?

2
Pavan K

1つのコマンドでこれを行うことはできません。ただし、Linuxで実行していて、シェルとしてBash(または同様のもの)を使用していると仮定すると、必要なのは2つのコマンドだけです。これは、すべてのビデオにexact同じビデオおよびオーディオコーデックとタイムベース(fpsなど)がある場合にのみ機能することに注意してください。

1.ビデオと開始時間のリストを作成します

まず、以下を含む編集リストを作成する必要があります。それをvideosと呼びましょう:

1.webm 00:00:00
2.webm 00:00:10
3.webm 00:00:20

これはスペース付きのビデオ名をサポートしないことに注意してください。

2.ビデオを分割します

次に、小さいビデオを保持するための一時フォルダーを作成します。それを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ビデオおよびオーディオ用。

3.ビデオを連結します

ここで、 concatプロトコル を使用して、ファイルをマージして戻すことができます。

ffmpeg -f concat -i <(for f in tmp/*.webm; do echo "file '$f'"; done) -c copy output.webm

必要なのはこれだけです。これは、連結ファイルをその場で動的に作成することによって機能します。それ以外の場合は、 concatドキュメント に従って手動で作成する必要があります。

最後に、tmpフォルダーをクリーンアップできます。

2
slhck