ffmpeg を使用して 2 つのビデオ ファイルを結合するにはどうすればよいですか?

ffmpeg を使用して 2 つのビデオ ファイルを結合するにはどうすればよいですか?

次のコマンドを使用して、写真からタイムラプス ビデオをいくつか作成しました。

ffmpeg -i IMG_%03d.JPG -s 1440x1080 -sameq video.MP4

そして、それはうまくいきました。今度は、これらのタイムラプス ビデオをいくつか結合して、1 つの長いビデオを作成したいと思います (入力ビデオはすべてまったく同じ形式です)。私はすでに次のものを試しました:

cat video1.MP4 video2.MP4 > stitch.MP4

しかし、出力はvideo1.MP4と同じになります。

ビデオをトランスコードしたり、パラメータを変更したりする必要はありません。ビデオがプレイリストにあるかのように、エンドツーエンドのステッチングだけが必要です。

ありがとう!

答え1

ffmpeg の最新バージョンでは、concat デマルチプレクサを使用できます。次のような行を含む inputs.txt というファイルを作成します。

file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
file 'input4.mp4'

bash シェルでは、次のように for ループを使用してファイルを作成できます。

rm inputs.txt
for f in input{1..4}.mp4; do echo "file '$f'" >> inputs.txt; done

それから、

ffmpeg -f concat -i inputs.txt -c copy output.mp4

を使用するため-c copy、完全にロスレスになります。

答え2

出力は video1.mp4 と同じにはなりませんが、ビデオのヘッダー/フッターは video1.mp4 のあたりで始まり、終わるので、プレーヤーは video2.mp4 に入りません。ビデオのビットレート/コーデックなどが同じであると仮定すると、次のようになります。

cat video1.MP4 video2.MP4 | ffmpeg -y -i - -genpts -vcodec copy -acodec copy stitch.MP4

これは必ずしも最良の方法ではないことを心に留めておいてください(すべてのタイムラプスを1つのビデオで同時に作成した方が良いでしょう)。コーデックが非可逆である場合、世代損失

答え3

ffmpeg を使うとおっしゃっていますが、私は単純にファイルをつなぎ合わせるだけなら mp4box を使ってうまくやっています。ここからダウンロードできます。

http://gpac.wp.mines-telecom.fr/mp4box/

コマンドラインの例を次に示します。

mp4box -cat <file> -cat <file> dest.mp4

関連情報