Как добавить новые кодеки в MPlayer

By Konstantin Lepikhov

Как добавить новые кодеки в MPlayer (по мотивам Understanding MPlayer's etc/codecs.conf File).

Введение

Одна из замечательных особенностей MPlayer'а - очень гибкая архитектура кодеков, которая позволяет ему использовать при проигрывании собственные кодеки, так же, как и открытые библиотеки, DLL от Win32 и бинарные модули от XAnim (а еще Real Multimedia и много еще чего. Для конечного пользователя, самый заметный кусочек этой архитектуры - это файл /etc/codecs.conf. Это текстовый конфигурационный файл, в котором написано, какой компонент MPlayer'а использовать для проигрывания того или иного формата мультимедиа данных.

Файл codecs.conf хранится или в директории, доступной всем пользователям системы, или в .mplayer, находящимся в $HOME. При запуске, MPlayer сначала смотрит codecs.conf в $HOME/.mplayer, если не находит, то ищет общедоступный codecs.conf. Если и он не найден, он завершает работу.

Файл codecs.conf действительно прост. Это просто список блоков, определящих кодек и какие media типы должны им обрабатываться. Есть несколько ключевых слов, которые могут встречаться в этих блоках. Но не обязательно, что все они должны там присуствовать и не в определенном порядке.

Редактируем codecs.conf

Вы можете редактировать codecs.conf, используя ваш любимый текстовый редактор (даже notepad) Все, что будет написано после ";", будет считаться комментарием. Например:

Код:

; this is a comment
format 0x34616d69  ; "ima4" (MOV files)

Блоки кодеков могут располагаться а произвольном порядке, т.к это не важно для MPlayer'а. Но все таки, лучше располагать их так, чтобы потом самому было понятно. Например, все открытые (open source) кодеки, которые поддерживает MPlayer, сгруппированы в одну секцию.

Номер релиза

Если вы создали свой собственнный codecs.conf, вам требуется указать в нем уникальный номер релиза, чтобы исключить несовместимости с другими релизами этого файла. Формат релиза прост: (YYYYMMDD)

Код:

release 20020520

(Вообще-то любые изменения, вносимые в кодеки *требуют* обновления codecs.conf и после этого MPlayer перестает воспринимать старую версию codecs.conf. Не рекомендуется изменять эту строку, до тех пор пока вы точно не знаете, что делаете.)

Видео кодеки

А теперь давайте пробежимся по примерам. Вот простой пример блока видео кодека:

Код:

        videocodec indeo5ds
        info "Intel Indeo 5"
        status working
        fourcc IV50,iv50
        driver dshow
        dll "ir50_32.dll"
        guid 0x30355649, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x7
        out YV12
        out YUY2
        out BGR32,BGR24,BGR16,BGR15

Это полностью поддерживаемый и работающий видео кодек. Ключевое слово "videocodeс", говорит от том, что это начало описания нового видео кодека. "indeo5ds" - это уникальное имя кодека, который использует MPlayer.

Следующая строка начинается с ключего слова "info", которое определяет обычный текстовый комментарий для этого кодека.

Ключевое слово "status" определяет функциональный статус этого кодека. Сейчас MPlayer понимает 4 статус-уровня: working, buggy, crashing, untested.

Следущая строка - это список 4х буквенных кодов (FOURCCs), которые связаны с этим кодеком. Может быть больше одного FOURCC в строке fourcc, если они разделены запятыми. Также может быть несколько строк fourcc в блоке, определящем кодек.

Ключевое слово "driver" связывает этот кодек с внутренним модулем декодера MPlayer'а. Например, у MPlayer есть модуль "dshow", который обрабатывает данные, закодированные этим кодеком.

Ключевое слово "dll" указывает, какой Win32 или XAnim модуль должен быть загружен, чтобы оперировать этим media типом данных. Это ключевое слово обычно используется в сочетании с dshow, vfm, acm и xanim драйверами, т.к они используют закрытые бинарные модули.

Ключевое слово "guid" определяет 16-битный Microsoft GUID, который используют некоторые media файлы, чтобы обозначить кодек.

Ключевое слово "out" определяет, в какой формат выходных данных можно декодировать этот кодек. Как и с "fourcc", может быть несколько out строк и несколько форматов, разделеных запятыми на одной строке. Выходные форматы должны быть расположены по приоритетности.

Аудио Кодеки

Простой пример сравнительно полнофункционального работающего кодека:

Код:

        audiocodec mp3      
        info "MPEG layer-2, layer-3"   
        status working     
        comment "Optimized to MMX/SSE/3Dnow!"  
        format 0x50     
        format 0x55     
        format 0x33706d2e ; ".mp3" CBR/VBR MP3 (MOV files)        
        format 0x5500736d ; "ms\0\x55" older mp3 fcc (MOV files)        
        driver mp3lib     
        dll "mp3lib (mpglib)"    
        flags seekable

Многие ключевые слова - из videocodec-секции, так что мы не будем их снова описывать. Но есть и такие, которые мы еще не видели. Это ключевое слово "comment", по смыслу похожее на "info".

Ключевое слово "format" выполняет такую же функцию, как и строка fourcc. Но некоторые типы файлов (в основном AVI) определяют аудио форматы 16-битным номером, в отличие от 32-битных FOURCC's, поэтому необходимо использовать такое разделение. Но, как показано в этом примере, FOURCCs могут быть использованы в строке format, т.к они могут быть переведены в hex представление. Это важное замечание, т.к подобное может пригодится, если FOURCC содержит пробелы (например кодек "rle " от Apple).

Ключевое слово "flags" определяет дополнительные возможности этого кодека. На сегодняшний день, это только флаг seekable (т.е с возможностью поиска).

О теории к практике

А теперь попробуем самостоятельно добавить новый кодек в MPlayer. Для примера, возмем Cool codec, которым сейчас сжимают некоторые фильмы.

Исходные данные:

Что это нам дало? Перед нами кодек, похожий на dshow, работающий так же, как и он, но только MPlayer его не понимает. Почему? Т.к он ничего не знает про fourcc. Если посмотреть файл, пожатый этим кодеком, то можно увидеть, что внутри вместо привычных DIV3 fourcc'ов там какой-то странный COL1. Ну что ж, это тоже подходит. Открываем codecs.conf и добавляем туда следущее:

Код:

        videocodec ffdivx      
        info "FFmpeg DivX ;-) (MS MPEG-4 v3)"  
        status working     
        fourcc MPG3,mpg3 div3    
        fourcc MP43,mp43 div3      ; M$ MPEG4 v3 (fourcc mapping to div3)     
        fourcc DIV5,div5 div3      ; DivX 3.20 
        fourcc DIV6,div6 div4      ; -||-
        fourcc DIV3,div3,DIV4,div4   
        fourcc AP41 div3           ; AngelPotion stuff        
        fourcc COL1,col1,COL0,col0 ; Cool codec (based on mpg4ds32.ax)        
        
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^

        - это то, что добавили.

        driver ffmpeg     
        dll msmpeg4     
        out YV12,I420,IYUV

теперь можем спокойно смотреть такие фильмы, и никакие закидоны программеров не страшны.

P.S
К сожалению не со всеми кодеками проходит такой номер. Если у него изменился бы еще и GUID, то пришлось бы попотеть, ища его в бескрайних просторах реестра Также, если у него свой закрытый алгоритм сжатия (например, как у RealAudio), то здесь даже wine-эмуляция бессильна, и приходится по сути заниматься reverse engineering'ом.


Hosted by uCoz