dev_hands ([info]dev_hands) wrote,
@ 2009-01-26 01:56:00
Previous Entry  Add to memories!  Share this!  Next Entry
Entry tags:tips

История о контейнерах
Что из себя представляет файл с видеофильмом. Грубо говоря это набор из видео потока (кодированного каким-то кодеком), нескольких (0,1 или много) аудио потоков (кодированных каким-то кодеком), нескольких субтитров (в каком-то формате). Все это запаковано в один ящик - контейнер. Контейнер не отвечает за качество видео или аудио - это не его функция. Это просто коробка.

Тем не менее эта коробка может налагать некоторые ограничения на хранящиеся в ней данные. Посмотреть сравнение контейнеров можно на wikipedia: http://en.wikipedia.org/wiki/Comparison_of_container_formats
Как мы видим, многие контейнеры. В частности такие популярные как mp4, avi, wmv налагают ограничения на используемые кодеки. Что это значит для пользователя: сейчас у нас популярен один контейнер, завтра другой.

Другие контейнеры более универсальны и позволяют хранить потоки в произвольном формате.

Среди них есть интересный нам mkv (матрешка). Интересен он за счет использования EBML, что позволяет его расширять по мере необходимости, а не менять периодически шило (avi) на мыло (mp4 или wmv). Так же сам формат - public domain, есть качественные свободные реализации. Так же mkv сейчас поддерживается аппаратными проигрывателями. Совокупность этих свойств делает его отличным контейнером для хранения своей видео коллекции.

Что делать с уже имеющейся коллекцией видео? Ее довольно просто можно конвертировать. Сделаем это в полуавтоматическом режиме в усложненном варианте.

Итак, у нас в директории ~/soap есть собственноручно снятый сериал. С двумя аудио дорожками (рус - дорожка 2 и en - дорожка 1) в avi контейнере. При этом, основной дорожкой стоит английская и языки дорожек не помечены. То есть при запуске плеера без явного выбора у нас будет английская дорожка. Это относится ко всем файлам-сериям в данной директории. Перекодировать мы ничего не собираемся, так как это и есть первоисточник, который мы имеем. Лучше сделать уже не получится - а ухудшить качество можно легко.

Исправим эту ситуацию.
1) Установим пакет mkvtoolnix
2) Запускаем mkvmerge-gui и открываем (add) первую серию. В окне tracks появились найденные дорожки (как видео так и аудио). По очереди их выбираем и правим нужные параметры (выбираем language для звука). Дорожку с русской озвучкой поднимаем наверх (up) - делаем ее основной.
Когда все нужные параметры выбрали жмем кнопку 'copy to clipboard'. Если нам нужно переконвертировать один файл - можно было бы уже жать 'start muxing'.
Закрываем mkvmerge-gui.
3) Из Klipper (управление clipboard в kde) вытаскиваем строку

"mkvmerge" -o "~/soap/S1.mkv" --language 1:eng --language 2:rus -a 1,2 -d 0 -S "~/soap/S1.avi" --track-order 0:0,0:2,0:1

Она нам корректно переконвертирует первую серию. Обобщим команду.
4) $ cd ~/soap
$ find -type f -iname "*.avi" | while read fname; do mkvmerge -o "${fname%%.avi}.mkv" --language 1:eng --language 2:rus -a 1,2 -d 0 -S "${fname}" --track-order 0:0,0:2,0:1; done;
5) Проверили что все в порядке
$ rm -f *.avi

Естественно, что с разными по структуре файлами так не получится. В одном у нас аудио дорожка #1 - русская, в другом - французская.

Переконвертация одного файла у меня заняла около 30 секунд. Так что чай вы попить не успеете.

Теперь о том, зачем мы проставляли языки дорожек. В конфигурационном файле mplayer (~/.mplayer/config) мы можем указать предпочитаемые языки:
alang=ru,en
Это значит, что при открытии файла mplayer будет пытаться найти русскую звуковую дорожку. Если не найдет - то английскую. Если уж ее не найдет - откроет дорожку по умолчанию.




Create an Account
Forgot your login or password?
Log in with OpenID
English • Español • Deutsch • Русский…