Как вырезать аудиопотоки из файла MKV?


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

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

Ответы:


25

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

Есть несколько графических интерфейсов, которые могут вам помочь (проверьте ссылку на видеопомощь). Я не уверен, какой 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имеет много других опций для установки заголовков, добавления задержки для синхронизации звука и т. д., поэтому проверьте подробности на странице руководства .


5
Похоже, --atracksопция больше не существует, вместо этого следует использовать либо --audio-tracksили --video-tracks.
Малат

0

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

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

Это странно дает мне ошибку: «Должен быть указан по крайней мере один выходной файл»
StackedCrooked

попробуйте использовать полный путь, например: C: \ path \ to \ output.mkv (я полагаю, что вы находитесь в Windows по ссылке на медиаплеер)
Джон Т

@John T: использование полного пути (с кавычками или без) по-прежнему выдает сообщение об ошибке «Необходимо указать хотя бы один выходной файл».
StackedCrooked

0

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

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

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


0

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

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

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


1
Спецификатора l потока нет .
Llogan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.