我需要在特定时间将音频文件覆盖在现有的silence.mp3上。像这样:
[----[...audio1...]----------[...audio2...]---------------]
我尝试了以下操作,但不起作用:
ffmpeg -y -i silence.mp3 -itsoffset 4 -i audio1.mp3 -itsoffset 30 -i audio2.mp3 -c:a copy final.mp3
任何帮助将被申请。谢谢。
有几种方法。
ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex "[0]adelay=4s:all=1[0a];[1]adelay=30s:all=1[1a];[0a][1a]amix=inputs=2[a]" -map "[a]" output.mp3
请注意,混合滤波器会减小输出的音量,以防止削波。如果需要,可使用dynaudnorm或体积过滤器进行随访。
或adelay和concat过滤器。假定audio1.mp4
是10秒长,并且两个输入具有相同的采样率和通道布局:
ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex "[0]adelay=4s:all=1[0a];[1]adelay=16s:all=1[1a];[0a][1a]concat=n=2:v=0:a=1[a]" -map "[a]" output.mp3
或使用anullsrc过滤器生成无声文件作为分隔符:
ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -t 4 4.mp3
ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -t 16 16.mp3
创建input.txt:
file '4.mp3'
file 'audio1.mp3'
file '16.mp3'
file 'audio2.mp3'
然后使用concat demuxer:
ffmpeg -f concat -i input.txt -c copy output.mp3
所以过滤器复杂的3个文件会是这样的:
"[0]adelay=4s:all=1[0a];[1]adelay=30s:all=1[1a];[2]adelay=50s:all=1[2a];[0a][1a][2a]amix=inputs=3[a]"
?@boblapointe是的,看起来正确。我忘了提一下,以确保您使用的是最新的ffmpeg。旧版本不支持,
s
因此您必须提供以毫秒为单位的值,而它们不支持all=1
,因此您必须手动为每个通道提供延迟。例如,具有4秒延迟的立体声:adelay=4000|4000
。input.txt文件不应该是
file '4.mp3' file 'audio1.mp3' file '16.mp3' file 'audio2.mp3'
吗?@boblapointe是的。我忘了加那些。答案已更新。
你们提供自由服务吗?我怎么能联系到你?