我对 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"
这是我获得正确语法的唯一一个......但它仍然不太有效。有比我更聪明的人可以帮忙吗?另外,我更愿意保留所有视频,并确保它们是软字幕而不是烧录的 - 只是为了澄清。
语法是
-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
(用于测试):input.mkv
使用MediaInfo工具检查流:执行只保留英文字幕的命令:
ffmpeg -y -i input.mkv -map 0:v -map 0:a? -map 0:s:m:language:eng -codec copy tmp_output.mkv
使用MediaInfo
tmp_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的流只显示一个英文字幕流: