如何用FFmpeg创建包含全部音视频流的马赛克视频?
解决FFmpeg马赛克视频缺失多输入音频的问题
你的问题很典型——原来的FFmpeg命令只处理了视频合成部分,完全没对音频做任何处理,所以FFmpeg默认只会把第一个输入文件的音频加到输出里,其他三个的音频都被忽略了。下面给你两种常用的解决方案,你可以根据需求选择:
方案1:将所有音频混合成一个轨道(同步视频启动时间)
如果你希望各个视频的音频对应各自的启动时间播放,最终输出一个混合后的单音频轨道,这个方案最适合。我们需要给每个音频添加和视频对应的延迟,再用amix滤镜混合:
ffmpeg -i lead_1.mp4 -i lead_2.mp4 -i lead_3.mp4 -i lead_4.mp4 \ -filter_complex " color=s=1280x720:c=black [base]; [0:v] setpts=PTS-STARTPTS, scale=640x360 [upperleft1]; [1:v] setpts=PTS+35/TB, scale=640x360 [lowerright1]; [2:v] setpts=PTS+87/TB, scale=640x360 [upperleft2]; [3:v] setpts=PTS+183/TB, scale=640x360 [lowerright2]; [base][upperleft1] overlay=1 [tmp1]; [tmp1][lowerright1] overlay=1:x=640:y=360 [tmp2]; [tmp2][upperleft2] overlay=1 [tmp3]; [tmp3][lowerright2] overlay=1:x=640:y=360 [vout]; # 音频处理:统一格式+添加对应延迟+混合 [0:a] aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo [a0]; [1:a] aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo, adelay=35000|35000 [a1]; # 35秒延迟(毫秒为单位) [2:a] aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo, adelay=87000|87000 [a2]; # 87秒延迟 [3:a] aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo, adelay=183000|183000 [a3]; # 183秒延迟 [a0][a1][a2][a3] amix=inputs=4:duration=longest [aout] " -map "[vout]" -map "[aout]" -c:v libx264 -c:a aac lead_1_2_3_4.mp4
几个关键细节:
aformat用来统一所有音频的采样率、声道数等参数,避免amix滤镜因格式不兼容报错;adelay的参数是毫秒级的延迟,立体声需要给左右声道各写一个数值(比如35秒就是35000|35000);amix=inputs=4:duration=longest表示混合4个音频输入,输出时长取最长的那个素材,确保所有内容都被包含。
方案2:保留每个输入的音频作为独立轨道
如果你希望输出文件里保留4个独立的音频轨道(方便后续单独控制每个视频的音量或开关),可以用这个方案。同样需要给音频添加对应延迟保证音画同步,再用-map指定所有轨道:
ffmpeg -i lead_1.mp4 -i lead_2.mp4 -i lead_3.mp4 -i lead_4.mp4 \ -filter_complex " color=s=1280x720:c=black [base]; [0:v] setpts=PTS-STARTPTS, scale=640x360 [upperleft1]; [1:v] setpts=PTS+35/TB, scale=640x360 [lowerright1]; [2:v] setpts=PTS+87/TB, scale=640x360 [upperleft2]; [3:v] setpts=PTS+183/TB, scale=640x360 [lowerright2]; [base][upperleft1] overlay=1 [tmp1]; [tmp1][lowerright1] overlay=1:x=640:y=360 [tmp2]; [tmp2][upperleft2] overlay=1 [tmp3]; [tmp3][lowerright2] overlay=1:x=640:y=360 [vout]; # 给每个音频添加对应延迟 [0:a] adelay=0|0 [a0]; # 第一个音频无延迟 [1:a] adelay=35000|35000 [a1]; [2:a] adelay=87000|87000 [a2]; [3:a] adelay=183000|183000 [a3] " -map "[vout]" -map "[a0]" -map "[a1]" -map "[a2]" -map "[a3]" -c:v libx264 -c:a aac lead_1_2_3_4.mp4
说明:
-map参数依次指定输出的视频轨道和四个音频轨道,最终输出文件会包含1个视频轨+4个独立音频轨;- 如果你的输入音频格式不一致,同样可以给每个音频添加
aformat滤镜统一格式,避免编码报错。
如果不确定哪种方案更适合,推荐先试试第一种混合音频的方式,这是制作马赛克视频最常用的音频处理方式。
内容的提问来源于stack exchange,提问作者Dhulipala Chandrasekhar
相关产品推荐
相关产品推荐

