我对 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