
Я не очень хорошо разбираюсь в 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