使用ffmpeg为一个视频分别添加多个字幕

Use ffmpeg to add multiple subtitles separately to a video

我正在尝试使用 ffmpeg 向视频添加多种语言的字幕。我成功添加了 1 种语言,但似乎无法添加第二种语言。 我使用这个简单的脚本为我的视频添加英文字幕。

ffmpeg -i %1 -i subs_eng.srt -map 0 -vcodec copy -acodec copy -scodec subrip -metadata:s:s:0 language=English "%~n1"_eng.mkv

此外,我运行另一个脚本添加了荷兰语字幕。

ffmpeg -i %1 -i subs_nl.srt -map 0? -vcodec copy -acodec copy -scodec subrip -metadata:s:s:1 language=Dutch "%~n1"_nl.mkv

但是每当我添加第二语言时,它似乎什么也没做。命令终端显示ffmpeg正在处理视频,但vlc media player中只有1种字幕语言(第一种)。

我真的希望能够在 2 次拍摄中添加它,而不是在同一个脚本中添加它,因为我的所有视频都没有两种语言。

如果没有 -map 字幕流,ffmpeg 将 select 所有输入中只有一个字幕流。

ffmpeg -i %1 -i subs_nl.srt -map 0 -map 1 -vcodec copy -acodec copy -c:s:0 copy -c:s:1 subrip -metadata:s:s:1 language=Dutch "%~n1"_nl.mkv

我将现有字幕流的编解码器模式设置为 copy,并将新字幕流的编解码器模式设置为 subrip。这假设您之前只混合了一个字幕流。

其实更容易。您可以通过

向文件添加字幕而不删除旧的
ffmpeg -i input.mkv -i input.srt -map 0 -map 1 -c copy output.mkv

-map x 从一个文件中选择所有流,这样两个文件中的所有流都进入输出文件。如果添加更多的输入字幕轨道,则需要提供-map 2-map 3等。看到很自觉很简单Map documentation.

现在更棘手的是,如果你想正确地标记这些字幕。您可以添加

-metadata:s:s:0 language=heb -metadata:s:s:0 handler_name=Hebrew -metadata:s:s:0 title=Hebrew
-metadata:s:s:1 language=eng -metadata:s:s:1 handler_name=English -metadata:s:s:1 title=English

但你需要知道最终的映射将取决于字幕的原始文件ab/presence。

感谢 eladkarako