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

опубликовано по просьбе замечательного пользователя Котопес



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

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

И всё бы ничего, но когда у тебя средняя длина трека 6 минут, то волей-неволей думаешь о том, как его обрезать, тем самым уменьшив размер превью на жёстком диске и облегчив прослушивание пользователю.

к материалу.

Когда-то я использовал для этого набор POC-утилит; они работали только с мп3 и умели быстро рассчитать длину и вовремя вырезать/склеить.

Потом я быстренько написал обертку вокруг этого безобразия и на время забыл о нем.

Однако настали новые времена и люди стали скачивать музыку в форматах flac, Monkey Audio и других форматах без потерь.

Да и сам мп3 со временем изменился и в него часто стали добавлять альбомные картинки, что стало большой проблемой и причиной частых сегфолтов POC. Именно тогда я решил написать приложение, которое бы включало в себя весь набор POC-утилит для резки и склейки и, кроме того, имело бы кодировщик для mp3.

А теперь о том, что произошло:
перекодированный — консольная утилита для 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://myau.su/recoded/tags/0.1.3 перекодированный транк из svn: СВНКО svn://myau.su/recoded/trunk перекодированный

Как собрать:
Первое, что вам нужно сделать, это убедиться, что у вас есть libav (его желательно взять из svn проекта ffmpeg, так как в дистрибутивах он обычно довольно старый и архитектура библиотеки с тех пор изменилась).

Небольшая рекомендация по сборке ffmpeg и libav:

.

/configure --prefix=/usr --enable-shared --enable-static --enable-libmp3lame --enable-nonfree --enable-gpl

Это, с одной стороны, позволит включить несвободные и gpl компоненты (!sic, после чего библиотека станет нераспространяемой) и разрешить сборку с lame, которая нужна для кодирования mp3. Далее можно переходить к сборке самого приложения (для *nix систем понадобится cmake, для mac os — xcode) Для MacOS: откройте файл проекта в корне и нажмите cmd+b. Для *nix-систем:

cmake .

make

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



Параметры командной строки и коды выхода:
Параметры командной строки:
  • -f - из какого файла
  • -t - в какой файл
  • -v — некоторые подробности о декодируемом файле
Коды выхода:
  • 0 – завершено успешно
  • 1 - невозможно открыть файл
  • 2 - файл не может быть декодирован
  • 3 - невозможно создать выходной файл
  • 4 – зарезервировано для ошибки повторной выборки
  • 5 - невозможно закрыть файл для вывода


Использование:
Например, вы можете сделать это так:

.

/recoded -f input_file.ogg -t out.mp3 -v

В качестве вывода вы получите некоторую информацию о потоке (если он есть) и код выхода:

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, объединенный стерео, 96 кбит/с.

(независимо от того, какая была частота дискретизации и битрейт, это сделано потому, что mp3 во флеше избирательно относится к еде)

Примечания и комментарии автора:
Это первый релиз, даже не бета и не альфа, а скорее предварительный релиз.

Размещено исключительно для ускорения разработки.

Так что если у кого-то есть идеи или желание покопаться в коде — милости просим.

Теги: #mp3 #ffmpeg #Разработка сайтов

Вместе с данным постом часто просматривают: