Телефоны Nokia диктофонят в формате amr.
Подключаем телефон проводом к гламурненькой Ubuntu Karmic, переливаем надиктованное долгим кропотливым умственным трудом…
И тут нас поджидает неожиданный облом. Кодек для этих файлов не только не установлен, но и не находится при помощи встроенной (довольно часто, кстати, «делающей зашибись») утилитки поиска кодеков для gstreamer.
Более того, никакого быстрого способа в духе «поставил такой-то пакет, и оно дальше всё само» в сети не нашлось. Есть в репозитории пакеты libopencore-amrnb0 и libopencore-amrwb0, но на них никакие другие пакеты не опираются — то есть никакой проигрыватель эти библиотеки использовать по умолчанию не умеет.
Так вот, Убунту — это тоже линукс. Поэтому всё это безобразие будем править руками.
Далее выставляем открывать файлы *.amr с помощью нашего скрипта, и всё готово – по дабл-клику рядом с исходным файлом создаётся ogg с таким же именем, который можно играть на чём угодно.
Этим постом мне бы хотелось напомнить многим, что Ubuntu всё же гораздо ближе к Gentoo, нежели к MS Windows, и оставляет огромный простор для доводки и пересборки кода тому, кто этого хочет.
Подключаем телефон проводом к гламурненькой Ubuntu Karmic, переливаем надиктованное долгим кропотливым умственным трудом…
И тут нас поджидает неожиданный облом. Кодек для этих файлов не только не установлен, но и не находится при помощи встроенной (довольно часто, кстати, «делающей зашибись») утилитки поиска кодеков для gstreamer.
Более того, никакого быстрого способа в духе «поставил такой-то пакет, и оно дальше всё само» в сети не нашлось. Есть в репозитории пакеты libopencore-amrnb0 и libopencore-amrwb0, но на них никакие другие пакеты не опираются — то есть никакой проигрыватель эти библиотеки использовать по умолчанию не умеет.
Так вот, Убунту — это тоже линукс. Поэтому всё это безобразие будем править руками.
- Делай раз. Поддержка 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 таки можно. - Установим библиотеки для сборки.
Тут всё тривиально – вытягиваем *-dev пакеты, требуемые для компиляции, и библиотеки для amr (их две, было лень разбираться, которая именно нужна – авось вторая тоже в будущем пригодится):
$ sudo apt-get build-dep ffmpeg
$ sudo apt-get install libopencore-amrnb libopencore-amrnb-dev libopencore-amrwb libopencore-amrwb-dev
- Корректируем алгоритм сборки пакета для 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)
Теперь всё должно собраться. - Собираем обновлённый ffmpeg.
$ dpkg-buildpackage -rfakeroot -uc -b
Строим только бинарные пакеты (-b
), используя fakeroot (-rfakeroot
), и не подписываем изменений (-uc
).
На выходе в /usr/src получится целый ворох перекомпилированных пакетов. - Устанавливаем всё, что получилось.
$ sudo dpkg -i /usr/src/*.deb
(Если у вас там ещё какие-то пакеты лежат, которые не надо ставить, то чур я не виноват.) - Проверяем, поддерживает всё ли хорошо встало, есть ли поддержка amr в ffmpeg.
$ ffmpeg -version|grep amr
Если в полученной длиннющей колбасе есть кусок--enable-libopencore-amrnb --enable-nonfree --enable-libopencore-amrwb --enable-nonfree
, то всё прошло успешно. - Проигрываем файлы.
Сейчас наши файлы нармально играются при помощиffplay
. Плееры же, которые задействуют ffmpeg черезgstreamer0.10-ffmpeg
(например, Exaile), продолжают не находить кодеки. Что с этим делать, я пока не разобрался, и в качестве временной меры было решено просто перегонять все файлы.amr
в.ogg
. - Пишем скрипт-перекодировщик.
Где-нибудь в подходящем месте (мне нравится/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, и оставляет огромный простор для доводки и пересборки кода тому, кто этого хочет.