使用FFmpeg合并图片、音频与视频的报错问题求助
解决FFmpeg合并图片+音频+视频的报错问题
我来帮你搞定这个问题,先拆解下你遇到的两个错误,再给你能直接用的正确命令:
第一个命令的错误原因
你第一次调用的concat滤镜参数逻辑有误:
concat=n=3是错的,你要合并的是两段内容(图片+音频为第一段,视频为第二段),所以n应该设为2concat滤镜的输入顺序必须严格遵循[视频流1][音频流1][视频流2][音频流2]的规则,你之前只传入了视频的视频流([vid1]),没带视频的音频流,还打乱了顺序,导致视频流被误接到音频输入口,才触发了媒体类型不匹配的报错。
第二个命令的错误原因
报错No such filter: ' '是因为你在-filter_complex的参数里,换行后的多余空格被FFmpeg当成了无效滤镜名称。另外你引入的anullsrc完全没必要,我们直接用视频自带的音频流就行,只要提前统一好参数避免冲突。
正确的FFmpeg命令
这个命令完美匹配你的需求:前10秒显示图片并播放音频,之后无缝切换到视频,同时统一了分辨率、音频参数,避免兼容性问题:
ffmpeg \ -loop 1 -framerate 24 -t 10 -i item1.jpg \ -i "https://audio-ssl.itunes.apple.com/apple-assets-us-std-000001/Music/66/58/f7/mzi.eoocfriy.aac.p.m4a" \ -i item4.mp4 \ -filter_complex " [0]scale=432:432,setsar=1,format=yuv420p[img_v]; [1]aformat=sample_fmts=fltp:sample_rates=48000:channel_layouts=5.1[img_a]; [2:v]scale=432:432,setsar=1,format=yuv420p[vid_v]; [2:a]aformat=sample_fmts=fltp:sample_rates=48000:channel_layouts=5.1[vid_a]; [img_v][img_a][vid_v][vid_a]concat=n=2:v=1:a=1[v][a] " \ -map "[v]" -map "[a]" -c:v libx264 -c:a aac outputfile.mp4
关键参数解释
[0]scale=432:432,setsar=1,format=yuv420p[img_v]:将图片缩放到432x432,设置像素宽高比为1,统一视频格式为yuv420p(兼容绝大多数播放器)[1]aformat=...[img_a]:把音频转换成和视频音频一致的参数(采样率48000Hz、5.1声道),避免concat时因音频参数不匹配报错[2:v]scale=432:432...[vid_v]:将视频缩放到和图片一致的分辨率,保证画面衔接流畅[img_v][img_a][vid_v][vid_a]concat=n=2:v=1:a=1[v][a]:按正确顺序合并两段内容,输出合并后的视频流和音频流-map "[v]" -map "[a]":指定输出使用合并后的媒体流-c:v libx264 -c:a aac:使用通用编码器,确保输出视频的兼容性
额外提示
如果你的音频时长超过10秒,-t 10会自动截断音频到10秒,和图片时长匹配;如果音频不足10秒,图片会在音频结束后继续显示到10秒。
内容的提问来源于stack exchange,提问作者huynq9




