1. ホーム
  2. ffmpeg

[解決済み] FFmpegを使って2つのMP4ファイルを連結する方法は?

2022-03-14 23:18:02

質問

ffmpegを使って、2つのmp4ファイルを連結しようとしています。 私はこれを自動処理にする必要があり、それがffmpegを選択した理由です。 私は2つのファイルを次のように変換しています。 .ts ファイルを連結し、その連結されたファイルをエンコードしようとしています。 .ts ファイルを作成します。 ファイルは h264aac をエンコードして、できるだけオリジナルと同じかそれに近いクオリティを保ちたいと思っています。

ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4

残念ながら、エンコード中にffmpegから以下のエラーメッセージが返ってきました。

[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s    
av_interleaved_write_frame(): Error while opening file

この現象は、エンコードの約半分の段階で発生するため、2つの .ts ファイルを連結して動作させることはできないと思われます。

解決方法は?

結局、中間フォーマットにmpgを使ってうまくいきました(注:これは危険な例で、-qscale 0でビデオを再エンコードしてしまいます......)。

ffmpeg -i 1.mp4 -qscale 0 1.mpg
ffmpeg -i 2.mp4 -qscale 0 2.mpg
cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 0 -vcodec mpeg4 output.mp4