Вопрос: Не удалось понять команду ffmpeg -map


Я пытаюсь скопировать видео / аудио из контейнера mkv в mp4. Когда я бегу ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4 Мне не дано видео с польским звуком. Есть только один видеопоток, поток # 0: 0. Поток # 0: 1 - это польское аудио, # 0: 2 english и # 0: 3 - # 0: 5 - субтитры.

Я прочитал это https://trac.ffmpeg.org/wiki/How%20to%20use%20-map%20option но не понимаю этого. Почему -map 0: 1, написанный дважды в примере 1? Что делает -c: s? Что бы команда копировать # 0: 0 в видео и # 0: 2 в аудио?


2
2017-07-13 23:25


Источник




Ответы:


-map <inputNo>:<streamNo> сообщает ffmpeg взять поток streamNo от ввода inputNo и добавить его к выходу, где <inputNo> начинается с 0.

Иногда вы можете захотеть взять тот же входной поток дважды (например, -map 0:1 -map 0:1 в примере), потому что вы можете кодировать каждый с различными кодеками / параметрами. В этом примере вывод содержит один и тот же аудиопоток дважды, один в MP3, а другой в AAC.

По умолчанию (т. Е. Без -map команда вообще), одно видео, один звук и один поток субтитров с входов принимаются. Если вы хотите отобразить все потоки с одного входа, используйте -map <inputNo>,

То, что вы не получаете видео с помощью своей команды, может означать только одно: ваша видеодорожка закодирована кодеком, который может быть мультиплексирован в MKV, но не в MP4. Поэтому он автоматически отбрасывается. Можете ли вы опубликовать журнал ffmpeg -i input.mkv так что мы можем проверить, какие кодеки кодируются дорожками?

В заключение, -c:s используется для кодека субтитров (в то время как -c:a для аудио и -c:v для видео)


5
2017-07-14 07:13



«По умолчанию (т. Е. С командой no -map вообще) все потоки со всех входов принимаются один раз». - это неправда. ffmpeg будет принимать только один аудио, видео и субтитров. Если вы хотите, чтобы все потоки отображались, вам нужно -map 0, - slhck


Это был пример, который позволил мне понять. Представьте следующую команду:

ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv 

И вот как ffmpeg делает отображение:

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)
Stream #0:1 -> #0:2 (copy)
Stream #0:4 -> #0:3 (copy)
Stream #0:3 -> #0:4 (copy)

Что случилось?

В команде у нас есть только один вход: tears_of_steel.mkv. Вот почему все наши карты начинаются с # 0: ...

Затем мы пишем первый вариант карты: -map 0: 0, который относится к первому потоку нашего ввода (tears_of_steel.mkv), который может быть видеопотоком, но это не имеет значения.

Поскольку это первый вариант карты, он будет сопоставлен с первым потоком в нашем выходном файле (tears_of_steel-v2.mkv).

Затем мы напишем второй вариант карты: -map 0: 2, который относится к третьему потоку нашего ввода. Поскольку это второй вариант карты, он отображается на второй поток в нашем выпуске.

И так далее...

Я написал это на моем github: https://github.com/lingtalfi/ffmpeg-notes/blob/master/ffmpeg-map.md


1
2018-03-08 22:14





Это должно работать, не может быть проверено на этой машине:

ffmpeg -i input.mkv
-map 0:0 -map 0:2 \
-c:v copy \
-c:a aac \
-b:a 128k \
output.mp4

или

ffmpeg -i input.mkv -map 0:0 -map 0:2 -c:v copy -c:a aac -b:a 128k output.mp4

Пояснения

с: s является псевдонимом для кодека -scodec, который определяет кодек субтитров.

-март 0: 1 есть два раза, потому что пример имеет aac и mp3-выход.


0
2017-07-13 23:47



Не получится, потому что -c:a aac потребности -strict experimental слишком. - slhck