FFmpeg拼接多段不同分辨率MP4视频时参数不匹配错误的解决求助
FFmpeg拼接多段不同分辨率MP4视频时参数不匹配错误的解决求助
嘿,这个问题我之前也踩过坑!核心问题其实不是你没统一分辨率,而是样本宽高比(SAR)不匹配——你用scale滤镜只调整了分辨率,但每个视频原始的SAR还不一样,concat滤镜对视频参数的一致性要求极高,必须让所有输入视频的分辨率、SAR、像素格式这些都完全对齐才行。另外你提到的第二个视频丢失音频的问题,大概率是之前的方案没正确处理音频流的映射逻辑,我给你一个能同时解决这两个问题的方案,还能轻松扩展到3段以上的视频:
我的问题详情
我需要拼接n段不同分辨率的MP4视频,已经尝试在filter_complex里先统一缩放分辨率,但还是报错。举个3段视频的命令例子:
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -filter_complex "[0:v]scale=1024:576:force_original_aspect_ratio=1[v0]; [1:v]scale=1024:576:force_original_aspect_ratio=1[v1]; [2:v]scale=1024:576:force_original_aspect_ratio=1[v2]; [v0][0:a][v1][1:a][v2][2:a]concat=n=3:v=1:a=1[v][a]" -map [v] -map [a] output.mp4
执行后出现的核心错误信息:
[Parsed_concat_3 @ 000001c73586c800] Input link in0:v0 parameters (size 1024x553, SAR 248297:248320) do not match the corresponding output link in0:v0 parameters (949x576, SAR 69312:69277)
之前找到的部分解决方案会导致第二个视频丢失音频,而且我不知道怎么扩展到3段及以上视频。
解决办法
修正后的3段视频拼接命令
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -filter_complex \ "[0:v]scale=1024:576:force_original_aspect_ratio=1,setsar=1[v0]; \ [1:v]scale=1024:576:force_original_aspect_ratio=1,setsar=1[v1]; \ [2:v]scale=1024:576:force_original_aspect_ratio=1,setsar=1[v2]; \ [v0][0:a][v1][1:a][v2][2:a]concat=n=3:v=1:a=1[v][a]" \ -map "[v]" -map "[a]" -c:v libx264 -c:a aac output.mp4
关键改动说明
- 统一SAR参数:给每个
scale滤镜后面追加setsar=1,强制把所有视频的样本宽高比统一为1:1,彻底解决concat的参数不匹配问题。 - 明确指定编码器:加上
-c:v libx264和-c:a aac,避免FFmpeg自动选择编码器时出现兼容问题,同时确保音频流能被正确拼接和输出。 - 扩展到更多视频的方法:如果要拼接更多视频,只需要按照格式继续添加
[n:v]scale=1024:576:force_original_aspect_ratio=1,setsar=1[vn];,然后在concat的输入列表里加上[vn][n:a],最后把n=3改成对应的视频数量即可。
额外音频兼容提示
如果还是碰到音频异常,可以先检查每个输入视频的音频参数(采样率、声道数、格式),如果不一致,可以给每个音频流添加aformat滤镜统一参数,比如:
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -filter_complex \ "[0:v]scale=1024:576:force_original_aspect_ratio=1,setsar=1[v0]; \ [1:v]scale=1024:576:force_original_aspect_ratio=1,setsar=1[v1]; \ [2:v]scale=1024:576:force_original_aspect_ratio=1,setsar=1[v2]; \ [0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a0]; \ [1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]; \ [2:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a2]; \ [v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[v][a]" \ -map "[v]" -map "[a]" -c:v libx264 -c:a aac output.mp4
备注:内容来源于stack exchange,提问作者Matteo Pasini




