Pull to refresh

Добавляем поддержку .amr в Ubuntu Karmic

Reading time3 min
Views1.4K
Телефоны Nokia диктофонят в формате amr.
Подключаем телефон проводом к гламурненькой Ubuntu Karmic, переливаем надиктованное долгим кропотливым умственным трудом…
И тут нас поджидает неожиданный облом. Кодек для этих файлов не только не установлен, но и не находится при помощи встроенной (довольно часто, кстати, «делающей зашибись») утилитки поиска кодеков для gstreamer.
Более того, никакого быстрого способа в духе «поставил такой-то пакет, и оно дальше всё само» в сети не нашлось. Есть в репозитории пакеты libopencore-amrnb0 и libopencore-amrwb0, но на них никакие другие пакеты не опираются — то есть никакой проигрыватель эти библиотеки использовать по умолчанию не умеет.

Так вот, Убунту — это тоже линукс. Поэтому всё это безобразие будем править руками.

  1. Делай раз. Поддержка amr вообще-то бывает в ffmpeg. Но ребята из Ubuntu по каким-то (видимо, копирайтным) соображениям её не включили при сборке пакета.
    Пересоберём пакет более правильно, ведь на нашей родине лицензионные нарушения ещё никого не останавливали, верно?
    Скачиваем исходники:
    $ cd /usr/src
    $ apt-get source ffmpeg
    $ cd ffmpeg-0.5+svn20090706/

    В файле debian/confflags amr упоминается в контексте какой-то библиотеки, которой я не нашёл в стандартных репозиториях:
    confflags += $(call cond_enable_nf,/usr/include/amrnb/sp_dec.h,libamr-nb)
    confflags += $(call cond_enable_nf,/usr/include/amrwb/dec.h,libamr-wb)

    Здесь макрос cond_enable_nf проставляет нужные флаги для configure, исходя из наличия заголовков для каждой несвободной библиотеки. Изучив configure -h, видим в списке возможных флагов:
    --enable-libamr-nb enable libamr-nb floating point audio codec [no]
    --enable-libamr-wb enable libamr-wb floating point audio codec [no]
    --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
    --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]

    то есть библиотеки из opencore подключить к ffmpeg таки можно.
  2. Установим библиотеки для сборки.
    Тут всё тривиально – вытягиваем *-dev пакеты, требуемые для компиляции, и библиотеки для amr (их две, было лень разбираться, которая именно нужна – авось вторая тоже в будущем пригодится):
    $ sudo apt-get build-dep ffmpeg
    $ sudo apt-get install libopencore-amrnb libopencore-amrnb-dev libopencore-amrwb libopencore-amrwb-dev
  3. Корректируем алгоритм сборки пакета для ffmpeg
    Добавляем проверку на наличие библиотек amr из opencore в файл debian/confflags:
    confflags += $(call cond_enable_nf,/usr/include/amrnb/sp_dec.h,libamr-nb)
    confflags += $(call cond_enable_nf,/usr/include/amrwb/dec.h,libamr-wb)
    confflags += $(call cond_enable_nf,/usr/include/opencore-amrnb/interf_dec.h,libopencore-amrnb)
    confflags += $(call cond_enable_nf,/usr/include/opencore-amrwb/dec_if.h,libopencore-amrwb)


    Теперь всё должно собраться.
  4. Собираем обновлённый ffmpeg.
    $ dpkg-buildpackage -rfakeroot -uc -b

    Строим только бинарные пакеты (-b), используя fakeroot (-rfakeroot), и не подписываем изменений (-uc).
    На выходе в /usr/src получится целый ворох перекомпилированных пакетов.
  5. Устанавливаем всё, что получилось.
    $ sudo dpkg -i /usr/src/*.deb

    (Если у вас там ещё какие-то пакеты лежат, которые не надо ставить, то чур я не виноват.)
  6. Проверяем, поддерживает всё ли хорошо встало, есть ли поддержка amr в ffmpeg.
    $ ffmpeg -version|grep amr

    Если в полученной длиннющей колбасе есть кусок --enable-libopencore-amrnb --enable-nonfree --enable-libopencore-amrwb --enable-nonfree, то всё прошло успешно.
  7. Проигрываем файлы.
    Сейчас наши файлы нармально играются при помощи ffplay. Плееры же, которые задействуют ffmpeg через gstreamer0.10-ffmpeg (например, Exaile), продолжают не находить кодеки. Что с этим делать, я пока не разобрался, и в качестве временной меры было решено просто перегонять все файлы .amr в .ogg.
  8. Пишем скрипт-перекодировщик.
    Где-нибудь в подходящем месте (мне нравится /usr/local/bin) создаём файл amr2ogg, задаём ему права rwxr-xr-x и владельца root:root, а внутри пишем:
    #!/bin/sh
    ffmpeg -i "$1" "`echo "$1" | sed s/amr$/ogg/`"

Далее выставляем открывать файлы *.amr с помощью нашего скрипта, и всё готово – по дабл-клику рядом с исходным файлом создаётся ogg с таким же именем, который можно играть на чём угодно.



Этим постом мне бы хотелось напомнить многим, что Ubuntu всё же гораздо ближе к Gentoo, нежели к MS Windows, и оставляет огромный простор для доводки и пересборки кода тому, кто этого хочет.
Tags:
Hubs:
Total votes 19: ↑13 and ↓6+7
Comments18

Articles