You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

关键改动说明

  1. 统一SAR参数:给每个scale滤镜后面追加setsar=1,强制把所有视频的样本宽高比统一为1:1,彻底解决concat的参数不匹配问题。
  2. 明确指定编码器:加上-c:v libx264-c:a aac,避免FFmpeg自动选择编码器时出现兼容问题,同时确保音频流能被正确拼接和输出。
  3. 扩展到更多视频的方法:如果要拼接更多视频,只需要按照格式继续添加[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

火山引擎 最新活动