1. ffmpeg 的直接拼接功能
ffmpeg 命令行工具支持直接拼接视频文件和音频文件。因为无须重新编码,10s 左右即可拼接时长 1.5H 左右的视频文件,速度可谓相当快。
按照官网提供的最佳实践,先将需要拼接的文件名以一定格式写在文本文件中,比如:
# file.txt
file '/path/to/file1.mp4'
file '/path/to/file2.mp4'
然后,通过以下 ffmpeg 命令实施拼接:
ffmpeg -f concat -i mylist.txt -c copy output.mp4
但是,当拼接 .mp4 文件时,很可能会碰到类似如下的报错:
[mp4 @ 0x5597289620c0] Non-monotonous DTS in output stream 0:0; previous: 262, current: 262; changing to 263. This may result in incorrect timestamps in the output file.
[concat @ 0x559728914240] h264_mp4toannexb filter failed to receive output packet
file.txt: Invalid argument
2. H.264 编码格式转换为 MPEG-2 再作拼接
按官网的建议,如果希望无损地直接拼接 H.264 视频文件,须先将其转换为中间格式,MPEG-2(一般后缀为 .ts)。
操作方式:
ffmpeg -i /path/to/file1.mp4 -c copy intermediate1.ts
ffmpeg -i /path/to/file2.mp4 -c copy intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy output.mp4
实测成功,过程无报错且速度极快。
参考资料:
- 官网文档:https://trac.ffmpeg.org/wiki/Concatenate