使用ffmpeg为一个视频单独添加多个字幕

问题描述 投票:0回答:3

我正在尝试使用 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种字幕语言(第一种)。

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

ffmpeg subtitle mkv srt
3个回答
5
投票

如果字幕流没有

-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
。这假设您之前混合了一个字幕流。


3
投票

有关混合音频、视频、字幕和章节的 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


0
投票

我成功地使用不同的语言和一个 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"
© www.soinside.com 2019 - 2024. All rights reserved.