如何用FFmpeg合并不同时长音频并保留背景音频时长?
解决FFmpeg合并音频时长不符的问题
问题原因
你用的amerge滤镜会自动以输入音频中时长最短的那个作为输出时长,所以30秒的voz.wav直接把3分钟的background.wav截断了,导致输出只有30秒。
两种修改方案
方案1:让voz.wav循环播放直到background.wav结束
适合需要背景语音重复播放的场景,命令如下:
$code1 = "ffmpeg -y -i voz.wav -i background.wav -filter_complex \"[0:a]aloop=loop=-1:size=2e9[a0];[a0][1:a]amerge=inputs=2,pan=stereo|c0<c0+c2|c1<c1+c3[aout]\" -c:a libmp3lame -q:a 4 -shortest somnovo2.mp3"; system($code1);
参数说明:
aloop=loop=-1:size=2e9:让第一个音频无限循环,size=2e9设置足够大的循环缓冲区,避免中途停止pan=stereo|...:amerge会把两个立体声合并成4声道,该滤镜将其转成标准立体声输出-shortest:强制输出时长等于最短的输入(即3分钟的background.wav)
方案2:voz.wav只播放一遍,剩余时间静音填充
适合只需要一次语音,后面保留纯背景音的场景,命令如下:
$code1 = "ffmpeg -y -i voz.wav -i background.wav -filter_complex \"[0:a]apad[a0];[a0][1:a]amerge=inputs=2,pan=stereo|c0<c0+c2|c1<c1+c3[aout]\" -c:a libmp3lame -q:a 4 -shortest somnovo2.mp3"; system($code1);
参数说明:
apad:自动给voz.wav末尾填充静音,直到和另一个输入音频时长一致- 其他参数作用与方案1一致
内容的提问来源于stack exchange,提问作者Prinple Vrlo
相关产品推荐
相关产品推荐

