如何使用 FFmpeg 删除除第一个英语字幕通道之外的所有字幕通道?

如何使用 FFmpeg 删除除第一个英语字幕通道之外的所有字幕通道?

我对 FFmpeg 不是很熟悉,我自己也试过很多次,但我甚至搞不懂语法。所以我要向比我聪明的人请教。我希望使用 FFmpeg 删除所有非英语选项,然后将其删除。

之后,删除除第一个索引选项之外的所有英文选项。无论我怎么尝试,我都无法弄清楚,并且花了大约 3 个小时尝试,我最后的尝试是:

ffmpeg -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:s -map 0:m:language:eng -map:0:a:1? -codec copy "copy Episode 01 - Yaha-kui zaShunina.mkv"

这是唯一一个我得到正确语法的...但它仍然不太管用。有没有比我聪明的人能帮忙?另外,我更愿意保留所有视频,并确保它们是软低音,而不是烧录的。

答案1

语法是-map 0:s:m:language:eng

ffmpeg -y -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:a? -map 0:s:m:language:eng -codec copy "copy Episode 01 - Yaha-kui zaShunina.mkv"

问题是它映射了所有英文字幕(不仅仅是第一个流)。我们可以第二次执行 FFmpeg,以仅保留第一个英文字幕流-map 0:s:0

ffmpeg -y -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:a? -map 0:s:0 -codec copy "copy copy Episode 01 - Yaha-kui zaShunina.mkv"

(我不知道是否可以在一个命令中仅保留第一个英文流)。


下列邮政,说明映射英文音频流的语法为-map 0:a:m:language:eng
0:a指的是音频流。
我们可以将其替换为0:s来引用字幕流。


测试:

创建具有多个视频、音频和字幕流的合成视频文件(用于测试):

ffmpeg -y -f lavfi -i testsrc=size=384x206:rate=1 -f lavfi -i sine=frequency=300 -f lavfi -i sine=frequency=400 -f lavfi -i sine=frequency=500 -i in.srt -i in.srt -i in.srt -i in.srt -i in.srt -map:v 0 -map:a 1 -map:a 2 -map:a 3 -map:s 4 -map:s 5 -map:s 6 -map:s 7 -map:s 8 -c:v libx264 -c:a:0 ac3 -ar:0 44100 -c:a:1 ac3 -ar:1 44100 -strict -2 -c:a:2 dca -ar:2 44100 -c:s ass -metadata:s:a:0 language=fra -metadata:s:a:1 language=ger -metadata:s:a:2 language=eng -metadata:s:s:0 language=fra -metadata:s:s:1 language=ger -metadata:s:s:2 language=ger -metadata:s:s:3 language=ger -metadata:s:s:4 language=eng -t 10 input.mkv

内容in.srt(用于测试):

1
00:00:00,0 --> 00:00:01,0
Sec 0 to 1

2
00:00:01,0 --> 00:00:02,0
Sec 1 to 2

3
00:00:02,0 --> 00:00:03,0
Sec 2 to 3

4
00:00:03,0 --> 00:00:04,0
Sec 3 to 4

input.mkv使用MediaInfo工具检查码流:

Video
ID                                       : 1
Format                                   : AVC
...
Audio #1
ID                                       : 2
Language                                 : French
...
Audio #2
ID                                       : 3
Language                                 : German
...
Audio #3
ID                                       : 4
Language                                 : English
...
Text #1
ID                                       : 5
Language                                 : French
...
Text #2
ID                                       : 6
Language                                 : German
...
Text #3
Language                                 : English
...
Text #4
Language                                 : German
...
Text #5
ID                                       : 9
Language                                 : English

执行仅保留英文字幕的命令:
ffmpeg -y -i input.mkv -map 0:v -map 0:a? -map 0:s:m:language:eng -codec copy tmp_output.mkv

使用 MediaInfotmp_output.mkv我们可以看到有两个英文字幕。

再次执行 FFmpeg -map 0:s:0
ffmpeg -y -i tmp_output.mkv -map 0:v -map 0:a? -map 0:s:0 -codec copy output.mkv

使用 MediaInfo 工具检查 output.mkv 的流仅显示一个英文字幕流:

Text
ID                                       : 5
Language                                 : English
Default                                  : Yes
Forced                                   : No

相关内容