Работа с mkvmerge, или как добавить звуковые дорожки в видео.

Казалось бы, вполне обыденный вопрос, с которым может столкнуться любой желающий посмотреть или сохранить фильм/мультфильм/аниме у себя на компьютере. Вроде, зашел на rutracker, скачал фильм - наслаждайся. Но что если вы столкнетесь с вполне частой надписью в описании - external (ext)? Легко ли подключить звуковой файл, "врезать" звук?
А что если звуковых дорожек к файлу несколько, да ещё и к каждой серии (прим. аниме из 50 серии или больше :) ). Что делать с этим лесом файлов, все делать вручную для каждого файла в течении дня?
Как раз тут я и затрону некоторые из этих вопросов, потому что не раз появлялась нужда проделывать подобную операцию "слияния".
Это не будет слишком длинная статья, и постараюсь по-быстрому разложить все поставленные вопросы по полочкам.

Наш главный инструмент статьи - программа для работы с контейнером mkv: mkvmerge (утиты из набора mkvtoolnix). Советую обзавестись как консольным вариантом, так и графическим.
http://www.bunkus.org/videotools/mkvtoolnix/downloads.html - скачать последнюю версию можно тут.

Открыв файл в графическом режиме (mkvmerge GUI), вам сразу покажет и список дорожек, станет очевидным как добавить новую или поменять очередность старых. Экспортировать новый файл можно в нижней части программы.
Но так как многие это и так знают, я попробую поближе подобраться к автоматизации. А для этого нам понадобится подробнее остановится именно на консольном варианте mkvmerge.
Как вводить команды, не мне вас учить, а вот что именно вводить - это рассмотреть стоит.
Давайте рассмотрим основные операции по добавлению звуковых дорожек в контейнер.

1) Непосредственно само добавление mka аудио в контейнер. (форматы аудио могут быть и другие, например aac/mp3, как, впрочем, исходный файл не обязательно должен быть mkv).
mkvmerge --track-order 0:1,1:1,0:2 'input.mp4' './1/new_audio.mka' -o 'output_temp1.mkv'
это команда добавляет трек new_audio.mka (из файла 1 дорожки 1 [1:1]) к файлу input.mp4 (файл 0 с 2 дорожками 0:1 - видео, 0:2 - старая дорожка audio) в последовательности указаной в --track-order (в скобках записи в формате FID:TID):
  • NEW TID1: дорожка видео TID 1 из файла FID 0
  • NEW TID2: дорожка аудио TID 1 из файла FID 1 (новая дорожка)
  • NEW TID3: дорожка аудио TID 2 из файла FID 0
Таким образом на выходе у нас получается файл с 3 дорожками в необходимой нам последовательности (TID'ы уже преставились в указанной последовательности). Правда, необходимо так же указать дорожку по-умолчанию:
mkvmerge --default-track 2:yes --default-track 3:no 'output_temp1.mkv' -o 'output_temp2.mkv'
Мы указываем что треком по умолчанию является TID 2 (это новая дорожка, я её обозначил в предыдущем пункте как NEW TID2), и TID 3 (это старая дорожка из файла).
Готово! Теперь все стало на свои места. output_temp2.mkv - файл, с правильными дорожками.
Таким образом, не составило труда не только добавить дорожку, но и переставить их в правильной последовательности, когда новая дорожка стала первой по умолчанию, а старая осталась в контейнере, но перешла в конец файла.
Если не выполнять --track-order при добавлении дорожки, то она станет в конец нового файла с контейнером mkv.

Это все хорошо, но что быть если нужно проделать что-то подобное с целой кучей файлов? Мудрить в этом случае я не стал, а быстренько написал скрипт, к сожалению на базе скриптового языка php (прошу не винить, хотелось мне его написать как можно быстрее :), это первое что попалось под руку).
Скачать его можно с github'a
https://github.com/DEgITx/mergeallaudio
Закинуть в /usr/local/bin или ~/bin
и запускать командой:
/dir_with_video_files$ mergeaudio > script.sh
убеждаемся что в  script.sh все верно, затем выполняем сгенерированный script.sh который автоматически объединяет все найденые дорожки в подкаталогах с вашими видео-файлами.


Комментарии

Отправить комментарий

Популярные сообщения из этого блога

Qt/C++. Экспорт в pdf - это легко.

Старт