Вещание AAC-потока с помощью Icecast2 и streamTranscoder

    Недавно у меня встала задача транслировать радиопоток и поток онлайн-трансляции подкаста, в формате AAC (Advanced Audio Coding). Этот формат является более экономичным, чем MP3, и в то же время позволяет сохранять приемлемое качество звучания. По субъективным ощущениям 48Kbps AAC не отличается от 64Kbps MP3. В этой краткой заметке опишу, как я настраивал одновременное вещание в форматах MP3 128Kbps, MP3 64Kbps и AAC 48Kbps. При этом я воспользовался OpenSource-инструментом streamTranscoderv3, о котором, почему-то, на хабре не было ни слова. Принцип работы streamTranscoder изображен на рисунке. Далее, как его собрать и использовать.

    Первым делом сделаем checkout исходников этой программы:
    # svn co svn.oddsock.org/public/trunk/streamTranscoderv3

    Для сборки этих исходников понадобилось поставить следующие пакеты (сервер у меня на Ubuntu 10.04):
    # apt-get install automake libtool libmad0-dev libflac-dev libfaac-dev

    Чтобы сборка прошла успешно, пришлось немного допилить файлы, шедшие в комплекте исходников.
    1. Добавил в Makefile.am строчку:
    ACLOCAL_AMFLAGS = -I m4
    

    2. Раскомментировал в configure.in строчку
    AC_PROG_CXX
    

    3. Чтобы утилита скомпилировалась с поддержкой AAC, пришлось дописать в файл configure.in еще строчку:
      AC_DEFINE(HAVE_FAAC,1)
    

    сразу перед строкой
      FAAC_CFLAGS
    

    4. Для корректной сборки мне пришлось указать еще вот такой «костылек»:
    LIBFLAC_LIBDIR=. ./autogen.sh
    

    После компиляции получаем бинарник streamTranscoderv3, который помещаем, к примеру, в /opt/streamtranscoder.
    # mkdir -p /opt/streamTranscoder
    # mv streamTranscoderv3 /opt/streamTranscoder
    # cd /opt/streamTranscoder
    # ./streamTranscoderv3

    Первый запуск бинарника создаст в текущем каталоге конфиг streamTranscoder_0.cfg, в котором нужно будет указать параметры потока-источника. Редактируем до примерно такого состояния:
    # The source URL for the broadcast. It must be in the form http://server:port/mountpoint.  For those servers without a mountpoint (Shoutcast) use http://server:port.
    SourceURL=http://127.0.0.1:1976/apple
    AutomaticReconnectSecs=10
    AutoConnect=1
    # Log Level 1 = LOG_ERROR, 2 = LOG_ERROR+LOG_INFO, 3 = LOG_ERROR+LOG_INFO+LOG_DEBUG
    LogLevel=2
    # Log File
    LogFile=streamTranscoder
    # Number of encoders to use
    NumEncoders=2
    

    Параметр SourceURL указывает на поток-источник, который уже существует. Помимо остальных более-менее понятных параметров, мы также указали параметр NumEncoders=2, что означает, что мы будем формировать два дополнительных потока (в нашем случае 64Kbps MP3 и 48Kbps AAC).
    Запустив бинарник еще раз, получим конфиги кодировщиков, в нашем случае streamTranscoder_1.cfg и streamTranscoder_2.cfg. Они гораздо увесистее, комментировать каждый пункт нет смысла, просто приведу ссылку на то, как выглядит мой конфиг для AAC.

    Оценить качество звучания вы можете на странице подкаста AppleInsider.ru, либо скормив эти ссылки в свой любимый плеер: Hi (MP3 128Kbps), Low (MP3 64Kbps), AAC (48Kbps).
    Поделиться публикацией

    Похожие публикации

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

      +4
      Пользуюсь streamTranscoderv3 на одной из станций.
      Но если 1 всего поток и просто в разных битрейтах то значительно лучше воспользоваться MPD
      Он играет плейлист и может вещать на несколько айскастов в разных битрейтах и форматах.
      Я имею ввиду это удобно если на всех потоках имграет одна и та-же песня просто в разном кач-ве и форматах.
      А вот если нужно например разные жанры музыкальные на разных потоках тогда и пригодится этот streamTranscoderv3 или можно запускать несколько MPD. Кстати судя по замерам MP кушает меньше а делает больше. Можно еще подключить mpdscribble или lasfmsubmitd и постить пригрываемые треки на last.fm.
      Да и самим воспроизведением можно управлять хоть с телефона(у MPD куча интерфейсов и клиентов) Я написал на python для django сайта панель управления для диджеев и для админа управлять Icecast2/MPD.
      P.S. MPD может и без всяких Icecast2 музыку стримить. Нужно лишь сконфигурировать его чтобы он работал в режиме радиосервера еще — тогда он будет и автодиджей и радиосервер в одном лице.
        +2
        Некоторые незнаю что MPD умеет выступать еще и в роли радиосервера а не только плеера.
        Я уже писал тут как настроить итд.
          +1
          К сожалению, вещание через MPD несет очень много проблем. Главная его проблема — это дизайн, скажем плеер очень любит открывать и закрывать аудиоустройство, в случае вещания — это шут-плагин, что ведет к падению радио. Каждый аудиовыход строит свою цепочку фильтров, написать фильтр для подмешивания голоса не получилось, пришлось костылять более низкоуровнево. Много интересного можно узнать при исправлении работы с тегами. В общем, мы решили написать свою вещалку. Что-то вроде гибрида транскодера + мпд + смешивание потоков в реалтайме. В отличии от aac, у нас aac+, отправляемое по rtsp + rtmp + icy (icecast). Правда, у меня никак не дойдут руки все это дописать, потому крутим пока mpd, но скоро ему придет конец.
            0
            Да, у MPD есть некоторые проблемы, но я описал схему только одного вещания из плейлиста на потоки с разными форматами и битрейтами. А насчет подключения живых шоу то действительно MPD будет выключен и нужно будет как-то решать вопрос перекодировки стрима на потоки с другими форматами/битрейтами.
            Насчет подмешивания голоса можно подсмотреть как реализовано в code.google.com/p/ardj/ там много чего заюзано и festival и jabber bot итд — интересный проект.
            Насчет своей вещалки — уже писал на NodeJS сервер и вещалку(кроме обычных плееров, он еще умеет стримить на странице в нужном пользователю формате и через html5 audio работать). Кое-что для него взял от Node-Icecast-Streamer и node-icecast-stack но это больше эксперименты наверное. слишком память у меня там сильно течет… никак не допилю. знаю что не лучшая идея была писать на NodeJS =) Думаю написать что-нить на своем родном питоне).
              0
              Смотрел я этот ardj, ничего интересного там нет, а жаббер-боты у нас с самого основания радио. Фестиваль не только имеет отвратительный синтез, но и очень высокие требования к ресурсам. А плеер через HTML можно и на айскасте.
                0
                По поводу вещания со странички и HTML5. Было очень много шума о том, что вот дескать придет революция в мир веба и настанет сразу глобальное добро. На практике хочешь что-то мультимедийное замутить, скажем голос добавить в эфир — лезем за старым и «ненужным» флешем, на сервере миксуем и пихаем в эфир. Аналогично со звонками в эфир.

                А ваша вещалка просто готовые стримы кидала, или пережимала стрим на уровне семлов? Как там дела с aac+?
                  0
                  >А ваша вещалка просто готовые стримы кидала, или пережимала стрим на уровне семлов? Как там дела с aac+?
                  Нам нужен только mp3 другие форматы не рассматривали.
                  Потоки все в mp3 — 64,96,128 kbps
                  Одну из наших станций ребродкастит frodio.com и там есть наш поток в формате acc

                  Вещалка в целях экономии ресурсов стримит мастер поток mp3/128kbps и ниче не перекодирует так как файлы и так строго все mp3/128kbps. Постепенно добавляем в них обложки альбомов итд.
                  Но это все та вещалка что на NodeJS и она сейчас не удел — как я говорил память утекает.

                  > А плеер через HTML можно и на айскасте.
                  Но только пара браузеров смогут стримить через html5 audio.
                  Ну да джаббер ботов написать не проблема.

                  > На практике хочешь что-то мультимедийное замутить, скажем голос добавить в эфир
                  У нас есть живые шоу — диджеят реальные диджеи из америки и европы на реальных винилах и сидидеках которые говорят в микрофон во время шоу — у них все через пульт и вещается на станцию.
          +2
          На тему Icecast скажу что есть два отличных репозитория от Карла Хайеса icecast-kh обновляется почти ежедневно.
          И еще от русских ребят из радио анон. icecast-ra — судя по коммитам они добавили поддержку статистики в формате json, персональныйх паролей для каждого диджея итд.
            +2
            Много говорил с разработчиками Icecast2 они обещали выпустить новую версию еще до конца прошлого года а воз и ныне там. Скажу лишь что в следующей версии будут лишь багфиксы а вот в версиях после появятся мои коммиты и доработки(я добавил поддержку geoip локации слушателей, более широкую статистику с выводом на карты гугла и обновленный интерфейс админки. И еще пара моментов насчет более близкой интеграции Icecast2 с nginx например чтобы nginx перемалывал xsl файлы с помощью ngx_http_xslt_module ну и балансировка нагрузки между нарзными потоками итд).
              +2
              Самое главное забыл — это играющий трек и слушатели с их данными будут добавляться Icecast'ом сразу в redis и можно шустро получать оттуда данные и не беспокоить лишний раз радиосервер) Это опционально.
                +2
                Ибо у айскаста посещение страницы статистики приравнивается к слушателю. тоесть если открыть старинцу статистики кроме ресурсов на генерацию этих страниц, занимается еще и один слот клиента. а мог ведь быть слушатель а не какой-то скрипт или бот.
                Сорри за спам) я пойду.
                  0
                  И вовсе не спам. Всегда приятно послушать знающего человека, продолжайте)
                +1
                А у вас есть патчи, которые влияют непосредственно на вещание? Могли бы обменяться патчсетами (все наше в репозитории). У нас персональные пароли для диджеев, исправление кириллицы (из микса кодировок) и немного переделано подключение слушателя для стриминга aac+/wav. Что касается xsl, то можно вообще файлсерв выключить, логи у нас пишет патченый mpd (тоже можно взять в репозитории), в этих логах можно взять все необходимое, статус раздавать статикой (сейчас пишу обновление вещалки, кроме всего прочего вещалка еще обложки будет вытаскивать из mp3-файлов и публиковать вместе со статусом). Карты с geoip у нас генерятся обычным перловым скриптом, без всяких гугломапсов. В общем, можно сотрудничать.
                  0
                  Да насчет обложек тоже недавно добавили такой функционал — сейчас сделали пока просто дергаем из тегов mp3-шки чаще быстрее чем ждать резултат с last.fm/google итд. Ну мои подопечные станции все зарубежные — англия/сша так что поддержка кириллицы не в приоритете совсем. Насчет geoip сначала вообще делал nginx proxy перед icecast2 с балансировкой нагрузки, геобалансировкой, и плюс подставлялись геоданные к юзерагенту так что типа:

                  ...

                  proxy_set_header User-agent $geoip_city_country_code,$geoip_city_country_name,$geoip_city,$geoip_latitude,$geoip_longitude,$http_user_agent;
                  proxy_pass icecast2-server.com:port;
                  ...


                  И потом уже гео данные фигурировали в админке айсика и во всех логах итд.
                  Имхо лучше добавлять такие данные при добавлении слушателя чем постоянно генерить perl скриптом и каждый раз перелопачивать айпишники и записи в бд.

                  P.S. fileserve тоже выключен скрипты и стили в cdn хостятся.
                  Могу сейчас выложить на github кое-что из интерфейса для стандартного айсика.
                  Сделано 2 темы одна на jquerymobile а вторая Twitter Bootstrap.

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

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