FFmpeg を使用して 2 つの MP4 ファイルを連結する方法 [closed] 質問する

FFmpeg を使用して 2 つの MP4 ファイルを連結する方法 [closed] 質問する

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 ファイルを連結して動作させることはできないと思われます。

ベストアンサー1

FFmpeg には 3 つの連結方法があります。

1.連結ビデオフィルター

入力に同じパラメータ (幅、高さなど) がない場合、または同じ形式/コーデックがない場合、あるいはフィルタリングを実行する場合は、この方法を使用します。

このメソッドはすべての入力の再エンコードを実行することに注意してください。再エンコードを避けたい場合は、一致しない入力だけを再エンコードして同じコーデックとその他のパラメータを共有し、連結デマルチプレクサを使用してすべての再エンコードを回避できます。

ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv \
-filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] \
concat=n=3:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" output.mkv

2.連結デマルチプレクサ

再エンコードを回避したい場合、およびフォーマットがファイルレベルの連結をサポートしていない場合 (一般ユーザーが使用するほとんどのファイルはファイルレベルの連結をサポートしていません) に、この方法を使用します。

$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
    
$ ffmpeg -f concat -i mylist.txt -c copy output.mp4

Windowsの場合:

(echo file 'first file.mp4' & echo file 'second file.mp4' )>list.txt
ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4

または

(for %i in (*.mp4) do @echo file '%i') > list.txt
ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4

3.連結プロトコル

この方法は、ファイルレベルの連結をサポートする形式 (MPEG-1、MPEG-2 PS、DV) で使用します。MP4では使用しないでください。

ffmpeg -i "concat:input1|input2" -codec copy output.mkv

この方法は、MP4 などの多くの形式では機能しません。これは、これらの形式の性質と、この方法で実行される物理的な連結が単純すぎるためです。これは、ファイルをそのまま結合するのと同じです。


どちらの方法を使用するか不明な場合は、concat デマルチプレクサーを試してください。

こちらもご覧ください

おすすめ記事