16

Я пытался удалить ненужные аудиопотоки из файла MKV (Matroska). Причина, по которой я хочу сделать это, состоит в том, чтобы избежать необходимости вручную выбирать нужный поток в проигрывателе Windows Media.

Входной файл дает следующую информацию ffmpeg:

Stream #0.0: Video: mpeg4, yuv420p, 704x396 [PAR 1:1 DAR 16:9], 29.98 tbr, 1k tbn, 29.98 tbc
Stream #0.1(eng): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.2(jpn): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.3(eng): Subtitle: 0x0000
Stream #0.4(eng): Subtitle: 0x0000
Stream #0.5: Attachment: 0x0000
Stream #0.6: Attachment: 0x0000

Поскольку мне нужны потоки 0, 1 и 3 (sub), моя команда ffmpeg выглядит следующим образом:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle test.mkv

что странно дает ошибку:

At least one output file must be specified

Удаление субтитров:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -vcodec copy -acodec libmp3lame test.mkv

дает мне это:

Number of stream maps must match number of output streams

Кажется, я не очень понимаю, как работает опция "карта". Кто-нибудь поможет мне разобраться?

4 ответа4

25

Если все, что вам нужно, это удалить поток, а не перекодировать, вы, вероятно, захотите сделать это с помощью пакета MKVtoolnix (см. Страницу videohelp.com).

Есть несколько графических интерфейсов, которые могут вам помочь (проверьте ссылку на видеопомощь). Я не уверен, какой может быть точная mkvmerge mkvmerge, но я думаю, что-то вроде этого будет работать:

# first, get audio track info so we know which one to keep
mkvmerge -i input.mkv
File 'input.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AAC)
Track ID 3: audio (A_AAC)        <----------- for example, let's keep this one
Track ID 4: audio (A_AAC)

mkvmerge -o output.mkv --atracks 3 input.mkv

Это должно сработать (у меня нет файла, пригодного для тестирования, извините). --atracks опция указывает mkvmerge скопировать только перечисленные звуковые дорожки в новый файл. Если вы хотите оставить 2 и 3, но не 4, вы можете использовать --atracks 2,3 .

mkvmerge есть много других опций для установки заголовков, добавления задержки для синхронизации аудио и т. д., поэтому проверьте подробности на странице руководства .

0

Попробуйте -f чтобы форсировать указанный формат:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle -f mkv test.mkv
0

В своей первой команде вы не указали, что test.mkv был вашим выходным файлом. Похоже, вам нужно изменить эту часть на что-то вроде ... -c copy test.mkv или указать кодек как ... -c:s copy test.mkv .

И не уверен, что там делает этот флаг -newsubtitle . Но если у вас есть файл субтитров, в который вы хотите добавить, вы сможете сделать еще один флаг ввода -i input.srt . Смотрите эту ссылку для этого.

Во второй команде я думаю, что вы пытаетесь отобразить видеопоток и скопировать его. Поэтому вы можете попробовать удалить -vcodec copy и она должна просто работать. :)

0

Здесь действительно две отдельные проблемы:

  1. В первой командной строке порядок параметров может быть неправильным. Я думаю, что ключ -newaudio должен быть в конце, после имени выходного файла.

  2. Вторая командная строка, "Удаление субтитров", поскольку во входном файле есть субтитры, для их удаления необходимо использовать ключ -sn . В противном случае, кажется, что FFmpeg хочет по крайней мере один, указанный в списке -map .

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