如何使用ffmpeg拼接不同宽高的视频且不产生大量重复帧
问题核心原因
- 两个输入视频帧率不匹配:第一个视频为25fps,第二个为30fps,
concat滤镜要求输入的视频参数完全对齐,参数不一致时会自动生成大量重复帧补全时长,直接导致运行速度骤降、出现上万帧重复的日志 - SAR(像素宽高比)设置错误:你为缩放后的1080p视频设置SAR为1920/1080=16/9,这会导致编码时计算出异常的超大有效分辨率,触发libx264的MB码率超限警告,进一步拖慢编码速度
- 输出未指定固定帧率,导致mp4封装器识别到混乱的帧时序,触发帧率过高的警告
修复后的命令
ffmpeg -i /tmp/test-video.mp4 -i /tmp/test-video-1.mp4 \ -filter_complex "[0:v]scale=1920:1080,fps=25[0v],[0v]setsar=ratio=1[0vf]; \ [1:v]scale=1920:1080,fps=25[1v],[1v]setsar=ratio=1[1vf]; \ [0vf][0:a][1vf][1:a]concat=n=2:v=1:a=1[v][a]" \ -map "[v]" -map "[a]" -r 25 -vsync 2 -c:v libx264 -preset ultrafast -c:a aac -b:a 128k res.mp4
修改点说明
- 为每一路视频流添加
fps=25滤镜,统一输出帧率,避免自动补帧 - 把
setsar的参数改为1,匹配1080p视频标准的1:1像素宽高比,消除编码参数异常 - 输出添加
-r 25指定固定输出帧率,-vsync 2动态调整帧时序,避免重复帧生成和mp4封装警告 - 明确指定音频编码参数,保证拼接后的音频正常输出
- 如果偏好30fps的输出,把命令中所有
fps=25和-r 25的参数替换为30即可
内容的提问来源于stack exchange,提问作者A.K.M. Adib
相关产品推荐
相关产品推荐

