我正在尝试使用 ffmpeg 将多种语言的字幕添加到视频中。我成功添加了一种语言,但似乎无法添加第二种语言。 我使用这个简单的脚本为我的视频添加英文字幕。
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媒体播放器中只有1种字幕语言(第一种)。
我真的希望能够在两次拍摄中添加它,而不是在同一个脚本中,因为我的所有视频都没有两种语言。
如果字幕流没有
-map
,ffmpeg 将仅从所有输入中选择一个字幕流。
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
。这假设您之前混合了一个字幕流。
有关混合音频、视频、字幕和章节的 ruby 脚本,请参阅 https://gist.github.com/akostadinov/8197947def1fe61c12a5ffffc615c969
实际上很简单,但如果你想正确地做到这一点,那就很冗长了。您可以将字幕添加到文件中,而无需删除旧的字幕:
ffmpeg -i input.mkv -i input.srt -map 0 -map 1 -c copy output.mkv
-map x
选择文件中的所有流,以便两个文件中的所有流都进入输出文件。如果添加更多输入字幕轨道,则需要提供 -map 2
、-map 3
等。请参阅非常有意识且简单的地图文档。
现在更棘手的是您是否想正确标记这些字幕。可以添加
-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
但是您需要知道最终的映射,这将取决于原始文件/字幕的存在。
感谢eladkarako。
我成功地使用不同的语言和一个 FFMPEG 命令创建了字幕文件:
ffmpeg -y -loglevel "repeat+info"
-i "file:Intervista.mp4"
-i "file:Intervista_fr.srt"
-i "file:Intervista_en.srt"
-i "file:Intervista_it.srt"
-c copy
-map 0 -dn -map "-0:s" -map "-0:d"
-map "1:0" "-metadata:s:s:0" "language=FR" "-metadata:s:s:0" "handler_name=French" "-metadata:s:s:0" "title=French"
-map "2:0" "-metadata:s:s:1" "language=ENG" "-metadata:s:s:1" "handler_name=English" "-metadata:s:s:1" "title=English"
-map "3:0" "-metadata:s:s:2" "language=ITA" "-metadata:s:s:2" "handler_name=Italiano" "-metadata:s:s:2" "title=Italiano"
"file:output.mp4"