ffmpeg 合并多音轨的问题

问题

如果消除视频原音后再合并音轨,就可能出现空白音的情况。

主思路

就是把一段音频剪为视频同样长度,然后以这段音频为主来合并

详情

简单地合并音轨是这样的, input.mov+bgm.acc+input.mp3=mix.mp4,长度以 input.mov 里的音轨为准。

ffmpeg -hide_banner -i "input.mov" -i "bgm.aac" -i "input.mp3" -filter_complex "amix=inputs=3:duration=first:dropout_transition=0" -c:v "libx264" -c:a "aac" -y "mix.mp4"

这样合并出来的声音是正常的,如果 input.mp3很短也不要紧

如果input.mov没有音轨,那么就会出错,这时候就需要把一段音频剪为与视频一样长,使用ffprobe查出视频长度,假设是10s,再用ffmpeg剪出这段音频

ffmpeg -hide_banner -i "bgm.aac" -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 "input.mov" -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 "out.aac" 2>&1

然后再把视频和音频合并起来, -map 0:0 -map 1:0 其实就是选择第一个视频轨 0:0代表第一个输入文件的0轨 ,第二个音频轨 1:0 代表第二个输入文件的0轨

ffmpeg -hide_banner -i "input.mov" -i "out.aac" -map 0:0 -map 1:0 -c:v "libx264" -c:a "aac" -y "out.mp4"

总结

音轨长度比较重要,如果要保留原视频的音轨,那就把原视频的音轨先取出来,然后以这个长度为准肯定没错了。先合并音轨的思路比较适合检查中间结果,可以反复调整音轨,然后一次合并成功

参考

音频选项 ffmpeg Documentation

声道 AudioChannelManipulation – FFmpeg

你可能感兴趣的:(ffmpeg,视频编解码)