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

    публикуется по просьбе замечательного юзернэйма 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 во флеше избирателен к пище)

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

    Это первый релиз, даже не бета и не альфа, что-то еще дорелизное скорее. Выкладывается исключительно с целью ускорить разработку. Так что если у кого-то есть идеи или желание покопаться в коде то милости просим.
    Поделиться публикацией

    Комментарии 19

      +1
      >для файлов от 2х минут до 15 — деление на части по 30 секунд и запись четных в файл(при этом части равномерно размазываются по длинне всего файла а в пропуски равномерно добавляется то время которое остается после деления на 30 секундные фрагменты).

      немного не понял зачем это.
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          Спасибо за разъяснение, профайлы действительно будут полезны.
            0
            профили — звучит очень хорошо.
          0
          не прочитал до конца, но подумал… а просто ffmpeg разве не может нарезать mp3шку (любой иной медиа файл)?
            0
            просто — нет, только если писать скрипты вокруг ffmpeg
              0
              я просто точно не помню, но я ffmpeg'ом нарезал картинки из видео (да, я знаю что mplayer это делает быстрее, по слухам)… и просто мне думается что не проблема нарезать всё это дело (и от и до, и узнал размер, и вырезать и потом склеить)… ну вобщем ладно =) я поэтому и спросил, что точно незнаю =)
                0
                ну вот все эти операции тулза и должна выполнять
                  0
                  К сожаленью не только по слухам mplayer делает это быстрее, пробовал вырезать ffmpeg'ом, по сравнению с mplayer'ом работает в разы медленней, в особенности если вырезаемый файл не попал на keyframe. В итоге пришлось перейти на mplayer для скриншото деланья.
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                извините, немного не по теме, но может кто мне подскажет, какой максимальный/минимальный размер альбомных картинок в мп3? есть ли референсные картинки, т.е. когда картинка в одном треке альбома, а в остальных лишь линк на него? спасибо за внимание
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    спасибо, т.е. разные программы плееры по своему усмотрению ресайзят?
                    0
                    а чем можно картинки в mp3 запихивать? какую-нибудь консольную прогу, чтобы запихивала картинку во все mp3 в текущем каталоге (а так же чтобы доставала картинки из них)
                    а если проги нет, то доку, где понятно написано про смещения и формат, чтобы прогу самому написать можно было :)
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • НЛО прилетело и опубликовало эту надпись здесь
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • НЛО прилетело и опубликовало эту надпись здесь

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое