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

标签 ffmpeg h.264 mp4

我正在尝试使用 ffmpeg 连接两个 mp4 文件。我需要这是一个自动过程,因此我选择了 ffmpeg。我正在将这两个文件转换为 .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
这发生在编码的一半左右,这让我认为你不能将两个 .ts 文件连接在一起并让它工作。

最佳答案

FFmpeg 有三种连接方法:

1. concat video filter
如果您的输入没有相同的参数(宽度、高度等),或者格式/编解码器不同,或者您想要执行任何过滤,请使用此方法。
请注意,此方法对所有输入进行重新编码。如果您想避免重新编码,您可以只重新编码不匹配的输入,以便它们共享相同的编解码器和其他参数,然后使用 concat demuxer 来避免重新编码所有内容。

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. concat demuxer
当您想避免重新编码并且您的格式不支持文件级连接(一般用户使用的大多数文件不支持文件级连接)时,请使用此方法。
$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
    
$ ffmpeg -f concat -safe 0 -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
3. concat protocol
将此方法用于支持文件级连接的格式
(MPEG-1、MPEG-2 PS、DV)。不要与 MP4 一起使用。
ffmpeg -i "concat:input1|input2" -codec copy output.mkv
由于这些格式的性质和此方法执行的简单连接,此方法不适用于包括 MP4 在内的许多格式。

如果对使用哪种方法有疑问,请尝试使用 concat demuxer。
另见
  • FFmpeg FAQ: How can I join video files?
  • FFmpeg Wiki: How to concatenate (join, merge) media files
  • 关于ffmpeg - 如何使用 FFmpeg 连接两个 MP4 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25825538/

    相关文章:

    ios - 如何将 iOS 8 中的 AVSampleBufferDisplayLayer 用于带有 GStreamer 的 RTP H264 流?

    c# - 是否可以使用 Emgu CV 3.0 通过 rstp 协议(protocol)和 ffmpeg h264 打开实时流

    ffmpeg mkv to mp4转换器会丢失部分音频,如何在python中配置?

    ffmpeg - MP4 容器中的 H.264 编码流在 WMP12 Windows 7 中无法正常播放

    c++ - FFMPEG - 格式不可用?

    FFMPEG 缩放、缩放和连接过滤器

    opencv - GpuMat 到 FFMPEG 编码器

    ffmpeg - 使用 libx264 压缩一组图像时,为什么帧速率会影响最终输出大小?

    video - 在 mp4 (h.264/avc) 视频中帧速率不一致是否合法

    ffmpeg - 如何应用多个裁剪模糊?