Как стать автором
Обновить

Декодирование/нарезка/кодирование аудиофайлов

Время на прочтение3 мин
Количество просмотров5.8K
публикуется по просьбе замечательного юзернэйма catdog

Предыстория:

Вряд ли сейчас можно найти программера который не знает как наснимать скриншотов с помощью mencoder-а и использовать их в качестве превью для видео файла. Однако подобных решений для аудиофайлов я пока не видел, оно и понятно почему: здесь как правило можно или отдавать файл полностью или пережимать консольными конверторами в удобоваримый формат полностью.

И все бы хорошо, но когда у тебя средняя длинна трэка 6 минут, то волей неволей задумываешься как бы сделать нарезку, сократив тем самым размер превьюшек на жестком диске и облегчив задачу в прослушивании материала пользователю. Когда-то давно для этого я использовал набор утилиток POC, они работали только с mp3 и умели быстро считать длинну, резать/склеивать по времени. Тогда я быстренько написал враппер вокруг этого безобразия и на какое-то время забыл об этом.

Однако пришли новые времена и народ начала закачивать музыку во flac-е, monkey audio и других lossless форматах. Да и сам mp3 со временем видоизменился и в него частенько начали добавлять альбомные картинки, что стало большой проблемой и причиной частых сегфолтов POC.

Именно тогда я решил написать приложение которое бы вбирало в себя весь комплект утилиток POC по нарезке склейки и плюс к этому имело бы encoder для mp3.

А теперь о том что получилось:


recoded — консольная утилита для Linux/*BSD/Mac OS использующая libav(ffmpeg) для декодирования/нарезки/кодирования аудиофайлов. Отлично интегрируется в любые скрипты для конвертирования:
вам только надо скормить файл для нарезки и сказать куда положить готовую превьюшку.
За счет использования libav достигается поддержка почти всех аудио форматов которые имеют распространение(mp3,ogg,flac,ape,wav и другие).

Нарезка осуществляется по следующему алгоритму:
  • для файлов меньше 2х минут — это полная конвертация.
  • для файлов от 2х минут до 15 — деление на части по 30 секунд и запись четных в файл(при этом части равномерно размазываются по длинне всего файла а в пропуски равномерно добавляется то время которое остается после деления на 30 секундные фрагменты).
  • для файлов больше 15 минут — только первые 2 минуты.


Где взять:

Бета релиз:
myau.su/recoded-0.1.3.tgz
svn co svn://myau.su/recoded/tags/0.1.3 recoded

trunk из svn:
svn co svn://myau.su/recoded/trunk recoded

Как собрать:

Первое что надо сделать это удостовериться что у вас есть libav(желательно брать ее из svn-а проекта ffmpeg, ввиду того что в дистрибьютивах она как правило достаточно старая и архитектура библиотеки с тех пор поменялась).
Маленькая рекомендация по сборке ffmpeg и libav:
./configure --prefix=/usr --enable-shared --enable-static --enable-libmp3lame --enable-nonfree --enable-gpl
Это с одной стороны включит nonfree и gpl компоненты(!sic после чего библиотека станет нераспространяемой) и разрешит сборку с lame-ом который нужен для кодирования mp3.

Далее можно перейти к сборке самого приложения(под *nix системами понадобиться cmake, под mac os — xcode)

Для mac os:
открываете проектный файл в корне и жмете cmd+b.

Для *nix систем:
cmake .
make


В результате получите бинарь recoded который нам и нужен.

Опции командной строки и exit-коды:

Опции командной строки:
  • -f — из какого файла
  • -t — в какой файл
  • -v — немножко подробностей о декодируемом файле

Exit коды:
  • 0 — успешно завершено
  • 1 — невозможно открыть файл
  • 2 — невозможно декодировать файл
  • 3 — невозможно создать файл для вывода
  • 4 — зарезервировано под ошибку пересемплирования
  • 5 — невозможно закрыть файл для вывода


Использование:

К примеру это можно делать так:
./recoded -f input_file.ogg -t out.mp3 -v

В качестве вывода вы получите немного информации о потоке(если он есть) и exit-код:
Front ring size: 38393856
Samples decoded: 19196928
Samples bytesize: 76787712
Channels: 2
Codec name: MP3 (MPEG audio layer 3)
Sample format: 1
Sample rate: 44100


На входе может быть любой аудио(видео+аудио) файл, файл может быть без расширения вообще(формат угадывается библиотекой libav по заголовкам и содержимому)
На выходе получается всегда mp3 44100, joined stereo, 96kbps. (вне зависимости от того какой был sample rate и битрэйт, сделано так потому что мп3 во флеше избирателен к пище)

Замечания и комментарии автора:

Это первый релиз, даже не бета и не альфа, что-то еще дорелизное скорее. Выкладывается исключительно с целью ускорить разработку. Так что если у кого-то есть идеи или желание покопаться в коде то милости просим.
Теги:
Хабы:
Всего голосов 28: ↑26 и ↓2+24
Комментарии19

Публикации