3

Я пытаюсь скопировать видео / аудио из контейнера MKV в MP4. Когда я запускаю ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4 Мне не дают видео с польским звуком. Там только один видеопоток, поток № 0:0. Поток # 0:1 - это польский звук, # 0:2 - английский, а # 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 в аудио?

4 ответа4

5

-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 для видео)

1

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

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

0

Это простой ответ для таких людей, как я, которым нравятся простые рабочие объяснения. Это решение, когда вы копируете mkv в mp4 и хотите выбрать аудио потоки:

Вы должны написать -map 0:numberofstreamminusone перед -c: копия

Допустим, у видео есть 3 потока (вы можете увидеть это в mediainfo). Первый поток - это видео, второй - аудио по умолчанию, а третий - аудио не по умолчанию на нужном вам языке. Таким образом, вы должны написать -карту 0:2 НЕ -карту 0:3

Кроме того, вы должны написать -map 0:0 перед копией -c:v, потому что если вы этого не сделаете, ffmpeg не будет копировать видеопоток, а вы получите только аудиопоток (если у видео есть два видеопотока и вы хотите скопировать второй, вам нужно написать -карту 0:1)

Итак, последняя командная строка выглядит так:

ffmpeg -i "inputpath\input.mkv" -map 0:0 -c:v copy -map 0:2 -c:a copy "outputpath\output.mp4"

В этом случае вы получите первый видеопоток и третий аудиопоток

Другой пример:

ffmpeg -i "inputpath\input.mkv" -map 0:1 -c:v copy -map 0:6 -c:a copy "outputpath\output.mp4"

В этом случае вы должны получить второй видеопоток и седьмой аудиопоток

надеюсь, это поможет

0

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

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

Пояснения

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .