如何使用ffmpeg为视频添加多个独立可选的音轨流
多音轨封装FFmpeg bat脚本方案
核心实现逻辑
- 用
-map参数分别指定视频流、原视频音轨、三个外部WAV音轨,所有流独立封装不混合 - 用
-metadata:s:a:[音轨序号]参数为每条音轨配置ISO 639-2标准语言标识和显示标题 - 视频流直接复制无需重新编码,音频可按需选择编码格式,兼顾速度和兼容性
完整bat脚本代码
@echo off :: 配置参数,请根据实际情况修改以下变量 set "INPUT_VIDEO=video.mp4" set "AUDIO1=audio1.wav" set "AUDIO1_LANG=eng" :: 替换为audio1对应的ISO 639-2代码,比如中文为zho set "AUDIO1_NAME=English" :: 替换为播放器显示的音轨名称 set "AUDIO2=audio2.wav" set "AUDIO2_LANG=jpn" set "AUDIO2_NAME=Japanese" set "AUDIO3=audio3.wav" set "AUDIO3_LANG=kor" set "AUDIO3_NAME=Korean" set "OUTPUT_FILE=output_multitrack.mp4" :: 是否保留原视频自带的音轨,需要保留则设为1,不需要设为0 set "KEEP_ORIGIN_AUDIO=1" :: 构建FFmpeg命令 set "CMD=ffmpeg -i "%INPUT_VIDEO%" -i "%AUDIO1%" -i "%AUDIO2%" -i "%AUDIO3%" -map 0:v -c:v copy " if %KEEP_ORIGIN_AUDIO% equ 1 ( set "CMD=%CMD% -map 0:a " ) set "CMD=%CMD% -map 1:a -map 2:a -map 3:a -c:a aac -b:a 192k " :: 配置原音轨元数据(如果保留) if %KEEP_ORIGIN_AUDIO% equ 1 ( set "CMD=%CMD% -metadata:s:a:0 language=und -metadata:s:a:0 title="Original Audio" " set "AUDIO_OFFSET=1" ) else ( set "AUDIO_OFFSET=0" ) :: 配置三个外部音轨元数据 set /a track1=%AUDIO_OFFSET% set /a track2=%AUDIO_OFFSET%+1 set /a track3=%AUDIO_OFFSET%+2 set "CMD=%CMD% -metadata:s:a:%track1% language=%AUDIO1_LANG% -metadata:s:a:%track1% title="%AUDIO1_NAME%" " set "CMD=%CMD% -metadata:s:a:%track2% language=%AUDIO2_LANG% -metadata:s:a:%track2% title="%AUDIO2_NAME%" " set "CMD=%CMD% -metadata:s:a:%track3% language=%AUDIO3_LANG% -metadata:s:a:%track3% title="%AUDIO3_NAME%" " :: 设置默认音轨(可选,这里默认用原音轨,不需要可以删掉下面这行) if %KEEP_ORIGIN_AUDIO% equ 1 ( set "CMD=%CMD% -disposition:a:0 default " ) :: 执行命令 %CMD% -y "%OUTPUT_FILE%" echo 封装完成,输出文件:%OUTPUT_FILE% pause
注意事项
- 所有输入文件和bat脚本放在同一文件夹下即可直接运行
- 不需要保留原视频自带音轨的话,将
KEEP_ORIGIN_AUDIO变量改为0即可 - 音频编码如果需要无损封装,可以将
-c:a aac -b:a 192k替换为-c:a copy,但要注意WAV封装到MP4的兼容性问题,优先推荐用AAC编码 - 输出的MP4文件在VLC等播放器中可以直接在音频轨道菜单中选择对应语言的音轨,不会自动混合
内容的提问来源于stack exchange,提问作者audioguy
相关产品推荐
相关产品推荐

