如何使用FFmpeg连接两个MP4文件?


春风助手
2025-02-28 11:33:53 (3小时前)

我正在尝试使用ffmpeg连接两个mp4文件。我需要这是一个自动过程,因此为什么选择ffmpeg。我将两个文件转换为.ts文件,然后将它们串联,然后尝试对该简洁的.ts文件进行编码。这些文件是h264和aac编码的,我希望尽可能保持质量不变或接近原始质量。

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
这种情况发生在编码过程的一半左右,这使我认为您无法将两个.ts文件连接在一起并使它正常工作。

2 条回复
  1. 1# 只怕再见是故人 | 2020-08-19 17-27

    FFmpeg具有三种串联方法:

    1. concat视频过滤器
      如果输入的参数不同(宽度,高度等)或格式/编解码器不同,或者要执行任何过滤,请使用此方法。(您可以重新编码不匹配的输入,以便它们共享相同的编解码器和其他参数,然后使用concat多路分配器避免重新编码其他输入)。
    1. ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv \
    2. -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a]
    3. concat=n=3:v=1:a=1 [v] [a]" \
    4. -map "[v]" -map "[a]" output.mkv

    请注意,此方法执行重新编码。

    1. concat分离器
      如果要避免重新编码并且格式不支持文件级串联(一般用户使用的大多数文件不支持文件级串联),请使用此方法。
    1. $ cat mylist.txt
    2. file '/path/to/file1'
    3. file '/path/to/file2'
    4. file '/path/to/file3'
    5. $ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

    对于Windows:

    1. (echo file 'first file.mp4' & echo file 'second file.mp4' )>list.txt
    2. ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4
    1. concat协议
      将此方法用于支持文件级串联的格式(MPEG-1,MPEG-2 PS,DV)。千万不能用MP4使用。
      1. ffmpeg -i "concat:input1|input2" -codec copy output.mkv
      由于这些格式的性质以及此方法执行的简单级联,因此该方法不适用于许多格式,包括MP4。

    如果不确定要使用哪种方法,请尝试使用concat多路分配器。

    另见
    FFmpeg常见问题解答:如何加入视频文件?
    FFmpeg Wiki:如何串联(合并,合并)媒体文件

登录 后才能参与评论