FFmpeg -shortest参数异常:音频流提前结束问题求助
大家好,我最近在用FFmpeg生成视频时碰到了个棘手的问题:当我使用-shortest参数时,输出文件的音频流总是比视频流早结束大概8.3秒,试了好几种配置都没搞定。
我的实际场景比较复杂——是用image2pipe把自动生成的图片流转成视频,同时用apad来确保音频流能延续到视频结束,但为了方便复现问题,我做了个简化的测试案例:
我用的命令是:
ffmpeg -framerate 30 -pattern_type glob -i "images/*.bmp" -i audio.mp3 -r 30 -shortest output.mp4
其中images目录里有600张相同的480×360分辨率BMP图片(按30fps算的话,视频时长应该是20秒),音频是一个标准的MP3样本文件,但最终输出的视频里,音频总是提前8.3秒就结束了,视频还在继续播放。
有没有朋友遇到过类似的问题?或者能给我一些排查和解决的思路?
可能的排查方向和解决方案
先确认音频的实际解码时长:有时候MP3文件的元数据时长和实际解码时长不一致,FFmpeg会读取元数据来判断时长,导致
-shortest提前终止音频。可以先跑这个命令获取音频的实际解码时长:ffmpeg -i audio.mp3 -f null -看看终端最后输出的
time=字段,对比音频文件属性里显示的时长,如果不一致,说明元数据有问题,可以先把音频重新编码(比如转成WAV再转回MP3)来修复。调整复用队列大小:部分场景下,音视频同步队列溢出会导致FFmpeg提前结束某一流,试试在命令里加上
-max_muxing_queue_size 1024(数值可以根据情况调大),比如:ffmpeg -framerate 30 -pattern_type glob -i "images/*.bmp" -i audio.mp3 -r 30 -max_muxing_queue_size 1024 -shortest output.mp4结合
apad和强制同步参数:既然你实际场景里要用apad补全音频,试试把音频滤镜和-shortest结合,同时加上同步参数强制对齐,比如:ffmpeg -framerate 30 -pattern_type glob -i "images/*.bmp" -i audio.mp3 -r 30 -filter:a "apad" -vsync 2 -async 1 -shortest output.mp4-vsync 2让视频跟随音频时长(这里因为用了apad,音频会被补到视频时长),-async 1强制音频同步。升级FFmpeg版本:旧版本的FFmpeg在
-shortest和apad的逻辑上存在一些bug,比如某些版本会错误判断音频的结束点,建议升级到最新的稳定版再测试。
备注:内容来源于stack exchange,提问作者asaelr

