如何使用FFmpeg拼接多个分辨率不一致的MP4视频?
FFmpeg拼接不同分辨率MP4视频解决方案
报错原因
FFmpeg的concat滤镜默认要求所有输入视频的视频参数(分辨率、像素宽高比、帧率)、音频参数(采样率、声道数、采样格式)完全匹配,否则无法直接拼接,你的报错就是两个输入视频分辨率不一致导致的。
方案1:保持原视频比例,补黑边拼接(无画面拉伸)
这个方案会把所有视频按原比例缩放到适配目标分辨率,多余部分补黑边,不会出现画面变形,是最常用的方案。你可以先选择一个目标分辨率(示例用1920x1080,可自行替换),对应的命令如下:
ffmpeg -i [第一个视频路径] -i [第二个视频路径] \ -filter_complex \ "[0:v]scale=w=1920:h=1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1[v0]; \ [0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a0]; \ [1:v]scale=w=1920:h=1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1[v1]; \ [1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]; \ [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" \ -map "[v]" -map "[a]" [输出视频路径]
参数说明
- 把命令里的
1920:1080替换成你需要的目标宽高即可,建议优先选择所有输入视频中最大的宽高作为目标,避免放大导致画质损失 force_original_aspect_ratio=decrease表示缩放时保持原视频比例,缩放后的最大边不会超出目标分辨率对应边pad参数负责给小于目标分辨率的部分补黑边,让所有视频最终输出尺寸完全一致,(ow-iw)/2:(oh-ih)/2表示黑边均匀分布在画面上下/左右两侧aformat参数统一所有输入的音频参数,避免音频规格不一致导致的拼接报错
方案2:拉伸视频到统一分辨率(无黑边,画面可能变形)
如果你不需要保留原视频比例,接受拉伸画面来填满目标分辨率,可以去掉pad部分,命令简化为:
ffmpeg -i [第一个视频路径] -i [第二个视频路径] \ -filter_complex \ "[0:v]scale=1920:1080,setsar=1[v0]; \ [0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a0]; \ [1:v]scale=1920:1080,setsar=1[v1]; \ [1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]; \ [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" \ -map "[v]" -map "[a]" [输出视频路径]
多视频扩展方法
如果需要拼接超过2个视频,只需要按以下逻辑修改命令即可:
- 新增
-i [第N个视频路径]输入参数 - 在filter_complex中新增对应第N个视频的视频流、音频流处理代码
- 把concat的
n=2改成对应视频总数即可
内容的提问来源于stack exchange,提问作者invisabuble
相关产品推荐
相关产品推荐

