Как удалить все каналы субтитров, кроме первого английского, с помощью 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

Используя 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

Проверка потоков output.mkv с помощью инструмента MediaInfo показывает только один поток английских субтитров:

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

Связанный контент