问题
如果消除视频原音后再合并音轨,就可能出现空白音的情况。
主思路
就是把一段音频剪为视频同样长度,然后以这段音频为主来合并
详情
简单地合并音轨是这样的, ++input.mp3=mix.mp4,长度以 里的音轨为准。
ffmpeg -hide_banner -i "" -i "" -i "input.mp3" -filter_complex "amix=inputs=3:duration=first:dropout_transition=0" -c:v "libx264" -c:a "aac" -y "mix.mp4"
这样合并出来的声音是正常的,如果 input.mp3很短也不要紧
如果没有音轨,那么就会出错,这时候就需要把一段音频剪为与视频一样长,使用ffprobe查出视频长度,假设是10s,再用ffmpeg剪出这段音频
ffmpeg -hide_banner -i "" -ss 00:00:00 -t 00:00:10 -c:a "aac" -y bgm_cut.aac
剪完后,合并音轨的命令要改一下, [1:a][2:a] 的意思就是找第2,3个输入文件中的音轨。
ffmpeg -hide_banner -i "" -i "bgm_cut.aac" -i "input.mp3" -filter_complex "[1:a][2:a]amix=inputs=2:duration=first:dropout_transition=0" -c:v "libx264" -c:a "aac" -y "mix.mp4"
还有一种办法就是把音轨先合并起来,这种思路适合中间检查结果
ffmpeg -hide_banner -i "bgm_cut.aac" -i "input.mp3" -filter_complex "amix=inputs=2:duration=first:dropout_transition=0" -c:a "aac" -y "" 2>&1
然后再把视频和音频合并起来, -map 0:0 -map 1:0 其实就是选择第一个视频轨 0:0代表第一个输入文件的0轨 ,第二个音频轨 1:0 代表第二个输入文件的0轨
ffmpeg -hide_banner -i "" -i "" -map 0:0 -map 1:0 -c:v "libx264" -c:a "aac" -y "out.mp4"
总结
音轨长度比较重要,如果要保留原视频的音轨,那就把原视频的音轨先取出来,然后以这个长度为准肯定没错了。先合并音轨的思路比较适合检查中间结果,可以反复调整音轨,然后一次合并成功
参考
音频选项 ffmpeg Documentation
声道 AudioChannelManipulation – FFmpeg