Linux环境下为视频添加多音轨、多字幕轨并设置元数据的方法及FFmpeg报错解决
Linux环境下为视频添加多音轨、多字幕轨并设置元数据的方法及FFmpeg报错解决
嗨,我来帮你搞定这个Linux上用FFmpeg处理视频音轨和字幕的问题!先说说你遇到的报错原因,再给你一步步的正确操作方法。
为什么会报错?
你碰到的错误是因为MP4容器默认不支持直接封装SubRip(.srt)格式的字幕,FFmpeg没法把srt直接拷贝进MP4里,得把字幕转成MP4支持的编码格式,比如mov_text才行。
单字幕轨添加+元数据设置(修正后的命令)
先把你之前的命令改对,给视频加英文字幕并设置元数据:
ffmpeg -i video_with_both_audio_tracks_already.mp4 -i subtitles_en.srt \ -metadata:s:s:0 language=eng \ -metadata:s:s:0 handler_name=English \ -metadata:s:s:0 title=English \ -map 0 -map 1 \ -c:v copy -c:a copy -c:s mov_text \ video_with_english_subtitles.mp4
这里的关键改动是-c:s mov_text,指定字幕转成MP4兼容的编码;-c:v copy和-c:a copy是直接复制原视频和音频流,不重新编码,省时间还不损失画质音质。
多字幕轨添加+批量元数据设置
如果要同时加英、法、德三个字幕轨,命令可以这么写:
ffmpeg -i video_with_both_audio_tracks_already.mp4 \ -i subtitles_en.srt -i subtitles_fr.srt -i subtitles_de.srt \ # 配置英文字幕(第0个字幕轨) -metadata:s:s:0 language=eng -metadata:s:s:0 handler_name=English -metadata:s:s:0 title=English \ # 配置法文字幕(第1个字幕轨) -metadata:s:s:1 language=fra -metadata:s:s:1 handler_name=French -metadata:s:s:1 title=French \ # 配置德文字幕(第2个字幕轨) -metadata:s:s:2 language=deu -metadata:s:s:2 handler_name=German -metadata:s:s:2 title=German \ -map 0 -map 1 -map 2 -map 3 \ -c:v copy -c:a copy -c:s mov_text \ video_with_multiple_subtitles.mp4
注意这里的索引规则:s:s:0对应第一个输入的字幕文件(subtitles_en.srt),s:s:1对应第二个,以此类推,别搞混就行。
同语言多音轨的元数据区分
你说两个音轨是同语言的不同版本,那可以用title元数据给它们加区分标识,比如一个标成立体声,一个标环绕声,命令如下:
ffmpeg -i video_with_both_audio_tracks_already.mp4 \ -i subtitles_en.srt -i subtitles_fr.srt -i subtitles_de.srt \ # 配置第一个音轨(原视频的第一个音轨) -metadata:s:a:0 language=eng -metadata:s:a:0 title="Stereo Audio" \ # 配置第二个音轨(原视频的第二个音轨) -metadata:s:a:1 language=eng -metadata:s:a:1 title="Surround Audio" \ # 字幕元数据配置和之前一样 -metadata:s:s:0 language=eng -metadata:s:s:0 handler_name=English -metadata:s:s:0 title=English \ -metadata:s:s:1 language=fra -metadata:s:s:1 handler_name=French -metadata:s:s:1 title=French \ -metadata:s:s:2 language=deu -metadata:s:s:2 handler_name=German -metadata:s:s:2 title=German \ -map 0 -map 1 -map 2 -map 3 \ -c:v copy -c:a copy -c:s mov_text \ final_video.mp4
这样播放器里就能看到两个音轨的不同标题,方便用户选择。
几个关键注意点
- 一定要用
-map参数明确指定要包含的所有流,不然FFmpeg可能会自动丢弃部分流 - 不同容器支持的字幕编码不一样,MP4用
mov_text,MKV的话可以直接拷贝srt不用转码 - 语言代码要用标准的ISO 639-2代码,比如英文
eng、法文fra、德文deu,这样播放器能正确识别语言分类
备注:内容来源于stack exchange,提问作者zvavybir
相关产品推荐
相关产品推荐

