Комментарии 38
Тоже вещаем в этой связке. Можно занести в подводные камни:
1. liquidsoap при внесении в 1 конфиг более 15 потоков начинает выдавать в эфир миллисекундные затыки звучания. Слышни, ужасны. Поэтому лучше иметь в виду, что при большой его нагрузке будет необходимо запускать несколько копий.
2. icecast2 стандартный не держит онлайн более ~3000 соединений. У вас максимум клиентов в конфиге выставлено 100. Если упретесь во что-то неведомое — меняйте icecast2 на сборку kh. Сайт сборки — www.xiphicecast.webspace.virginmedia.com/
3. Мыло собирали из latest stable сайта, а не из репозиториев, т.к. необходимой для нас поддержки aac+ нет в стандарте. Это для Ubuntu Server.
Ну и для полноты статьи, мини-конфиг для upstart:
Стандартно service air-st start/stop/restart (st — краткое название одной из станций. Удобно перезапускать их независимо).
1. liquidsoap при внесении в 1 конфиг более 15 потоков начинает выдавать в эфир миллисекундные затыки звучания. Слышни, ужасны. Поэтому лучше иметь в виду, что при большой его нагрузке будет необходимо запускать несколько копий.
2. icecast2 стандартный не держит онлайн более ~3000 соединений. У вас максимум клиентов в конфиге выставлено 100. Если упретесь во что-то неведомое — меняйте icecast2 на сборку kh. Сайт сборки — www.xiphicecast.webspace.virginmedia.com/
3. Мыло собирали из latest stable сайта, а не из репозиториев, т.к. необходимой для нас поддержки aac+ нет в стандарте. Это для Ubuntu Server.
Ну и для полноты статьи, мини-конфиг для upstart:
description "air-st"
start on (
net-device-up
local-filesystems
and runlevel [2345]
)
stop on runlevel [016]
respawn
exec su - liquidsoap -c "/usr/local/bin/liquidsoap /etc/liquidsoap/st.liq"
Стандартно service air-st start/stop/restart (st — краткое название одной из станций. Удобно перезапускать их независимо).
Спасибо, добавил ссылку в пост.
Можно ссылочки на методику тестирования? Ванильный icecast у нас держал по 5к соединений. Причем тут форк от Карла Хейса я не знаю (да, это форк, а не «сборочка»)
Точный предел я не помню, каюсь. Как и графиков на данный момент, не сохранилось.
Методика тестирования была следующая: новый сервер вещания был развернут в другом ДЦ (латест стэйбл убунта, icecast2 из пакетов). В конфигурации было установлено ограничение в миллион клиентов. Включили все потоки (на тот момент их было 56). Обновили ДНС-записи на новый сервер. Пошла нагрузка, мониторили онлайн плагином icecast2 к munin. Был достигнут суммарный онлайн в N-клиентов, после которого поведение стало следующим: подключиться было возможно только после 5-8 попыток. Продолжительное прослушивание «выбивало» клиента и вещание останавливалось при использовании плеера без функций переподключения (например, браузерный html5). Сразу же подумалось именно на разницу двух icecast2. Разница была найдена — именно в том, что ранее использовался форк kh. Поставили последний форк с той же конфигурацией — клиенты пошли подключаться выше предела в N-подключений.
Для статистики:
самый популярный маунт на текущий момент имеет рекорд в 7963 слушателей
сумма онлайна остальных маунтов станций примерно 7-8 тысяч слушателей
количество текущих потоков — 60 (15 станций, 4 формата), без учета служебных
Методика тестирования была следующая: новый сервер вещания был развернут в другом ДЦ (латест стэйбл убунта, icecast2 из пакетов). В конфигурации было установлено ограничение в миллион клиентов. Включили все потоки (на тот момент их было 56). Обновили ДНС-записи на новый сервер. Пошла нагрузка, мониторили онлайн плагином icecast2 к munin. Был достигнут суммарный онлайн в N-клиентов, после которого поведение стало следующим: подключиться было возможно только после 5-8 попыток. Продолжительное прослушивание «выбивало» клиента и вещание останавливалось при использовании плеера без функций переподключения (например, браузерный html5). Сразу же подумалось именно на разницу двух icecast2. Разница была найдена — именно в том, что ранее использовался форк kh. Поставили последний форк с той же конфигурацией — клиенты пошли подключаться выше предела в N-подключений.
Для статистики:
самый популярный маунт на текущий момент имеет рекорд в 7963 слушателей
сумма онлайна остальных маунтов станций примерно 7-8 тысяч слушателей
количество текущих потоков — 60 (15 станций, 4 формата), без учета служебных
Наконец-то годная статья про liquidsoap. Он и вправду незаслуженно непопулярен.
К liquidsoap есть веб-морда на Ruby. Добавьте в статью и про нее.
Не нашёл я в гугле информации по этому поводу.
Да сейчас куда-то пропал этот проект надо в svn поглядеть. Кстати вот уже писали о веб-интерфейсе Airtime — Управление радиоэфиром через браузер (Python/Django) он же упомянут вот тут savonet.sourceforge.net/tools.html
Airtime не совсем веб-морда, насколько я помню — это полноценный медиасервер+медиаисточник (т.е. кроме него больше ничего не надо), основанный на Liquidsoap. Я пробовал его до Liquidsoap, а в статье упомянул во втором абзаце. Хотелось остаться на нём, точно уже не помню, что не понравилось, но пришлось сменить решение.
Жаль что Airtime нет нормального рандома.
Спасибо за статью и комментарии выше и ниже, как раз собирался поднимать на Shoutcast, теперь подумаю.
Использую liquidsoap для ретрансляции одной популярной радиостанции. Загвоздка в том, что у меня нет стабильного собственного источника, приходится использовать сторонние.
Если кому будет полезно, так я делаю резервированный источник сигнала и допиливаю его:
1src = input.http(force_mime=«audio/mpeg»,buffer=5.0,max=10.0,user_agent=«WinampMPEG/5.54»,«url1»)
2src = input.http(force_mime=«audio/mpeg»,buffer=5.0,max=10.0,user_agent=«WinampMPEG/5.54»,«url2»)
3src = input.http(force_mime=«audio/mpeg»,buffer=5.0,max=10.0,user_agent=«WinampMPEG/5.54»,«url3»)
sat=amplify(5.,fallback(track_sensitive = true, [1src,2src,3src]))
Вопрос, который меня до сих пор мучает — как выдавать более качественный aac+ звук, используя что-то ещё, кроме aacplusenc. Пробовал кодер от nero, но не смог понять, как вытащить aac звук из mp4 контейнера. aacplusenc по качеству несколько хромает всё же если сравнивать с nero aac+
Ещё у меня есть скрипт — watchdog, который постоянно парсит логи, следит за наличием процесса и позволяет управлять запуском/остановкой. Завязан на cron и не использует init. Если кому нужно и имеют случае непонятного падения liquidsoap -общащайтесь.
Использую версию 0.9.0, т.к. она для моих задач оказалась самой стабильной.
Кстати кто-нибудь запускал rtmp/rtsp трафик на чём-нибудь опенсурсном (или не опенсурсном)? Хочу вещать aac+ в флеш-плеере. Просто aac+ поверх http флеш плеер не хавает(
Если кому будет полезно, так я делаю резервированный источник сигнала и допиливаю его:
1src = input.http(force_mime=«audio/mpeg»,buffer=5.0,max=10.0,user_agent=«WinampMPEG/5.54»,«url1»)
2src = input.http(force_mime=«audio/mpeg»,buffer=5.0,max=10.0,user_agent=«WinampMPEG/5.54»,«url2»)
3src = input.http(force_mime=«audio/mpeg»,buffer=5.0,max=10.0,user_agent=«WinampMPEG/5.54»,«url3»)
sat=amplify(5.,fallback(track_sensitive = true, [1src,2src,3src]))
Вопрос, который меня до сих пор мучает — как выдавать более качественный aac+ звук, используя что-то ещё, кроме aacplusenc. Пробовал кодер от nero, но не смог понять, как вытащить aac звук из mp4 контейнера. aacplusenc по качеству несколько хромает всё же если сравнивать с nero aac+
Ещё у меня есть скрипт — watchdog, который постоянно парсит логи, следит за наличием процесса и позволяет управлять запуском/остановкой. Завязан на cron и не использует init. Если кому нужно и имеют случае непонятного падения liquidsoap -общащайтесь.
Использую версию 0.9.0, т.к. она для моих задач оказалась самой стабильной.
Кстати кто-нибудь запускал rtmp/rtsp трафик на чём-нибудь опенсурсном (или не опенсурсном)? Хочу вещать aac+ в флеш-плеере. Просто aac+ поверх http флеш плеер не хавает(
На radiotalk.ru пытались приделать аас+, не помню, чем дело кончилось. На Linux'е лицензия позволяет aac+ вещать максимум в 64 кбит/сек, но там кто-то сторонние библиотеки пытался пришить.
Какая лицензия? На что лицензия?
Пример вещания в aac+ на Icecast:
radio.kanaria.ru:8000/radio.aac (для кривых плееров: radio.kanaria.ru:8000/radio.aac.m3u)
Правда у нас сервер немного патченый
Пример вещания в aac+ на Icecast:
radio.kanaria.ru:8000/radio.aac (для кривых плееров: radio.kanaria.ru:8000/radio.aac.m3u)
Правда у нас сервер немного патченый
Лицензия ограничивает битрейт — максимум 64 кБит/сек. Если верить mediainfo и VLC, у вас битрейт равен 12,3 кБит/сек, да и на слух что-то около того.
Есть ли смысл aac+ в более 64 кбит/с? На мой взгляд, даже 32 kbps звучит весьма комфортно.
Разве soundmanager2 не позволяет проигрывать aac+?
aac+ флеш может жрать через контейнер FLV (если с минимумом возни на клиенте, иначе надо ADTS разбирать руками)
засунуть его в RTMP можно опять таки через FLV, ибо внутри RTMP бегает только он. Все работает, все летает, но стримилку писал сам, ничего ШВАБОДНОГО не нашел для этого, сервер по идее может быть любым
c rtsp тоже множество вариантов, я частично добавил RTSP прямо в айскаст, правда только для ulaw-потоков.
Рекомендую зачитать ссылки из статьи
засунуть его в RTMP можно опять таки через FLV, ибо внутри RTMP бегает только он. Все работает, все летает, но стримилку писал сам, ничего ШВАБОДНОГО не нашел для этого, сервер по идее может быть любым
c rtsp тоже множество вариантов, я частично добавил RTSP прямо в айскаст, правда только для ulaw-потоков.
Рекомендую зачитать ссылки из статьи
Можно написать модуль для erlyvideo, который будет делать IceCast/AAC -> RTMP/AAC. И поставить erlyvideo как прокси.
Я б даже оценил сложность, правда я протокол IceCast не знаю.
Я б даже оценил сложность, правда я протокол IceCast не знаю.
Держать этого монстра как прокси? Не, можно конечно и микроскопом гвозди забивать, дело хозяйское. А в качестве RTMP-серверов есть много чего, неприятнее эрли навреное только оригинальный FMS.
Протокол там обычный ICY, инкапсуляцию в FLV может делать сам айскаст (kh-форк), остается только в RTMP засунуть. Не знаю нафига. Это как надеть трусы на голову — оригинально конечно, но толк то какой?
Протокол там обычный ICY, инкапсуляцию в FLV может делать сам айскаст (kh-форк), остается только в RTMP засунуть. Не знаю нафига. Это как надеть трусы на голову — оригинально конечно, но толк то какой?
>> Держать этого монстра как прокси
31 мб памяти на холостом ходу, копейки на коннект — не монстр. Писать ничего не надо, AAC/ShoutCast source есть из коробки — my fault. Поставил и забыл.
>> неприятнее эрли навреное только оригинальный FMS.
1. Такие сравнения обычно аргументируют.
2. Это мой tool of choice и если мне нужен RTMP-сервер, выбор для меня однозначен.
3. Вы свободный человек и свободны содомировать red5 или crtmpd.
>> Это как надеть трусы на голову
Я предложил простой и доступный путь решения, исходя из известных мне инструментов(в которых я, кстати, более чем уверен). Any problems?
31 мб памяти на холостом ходу, копейки на коннект — не монстр. Писать ничего не надо, AAC/ShoutCast source есть из коробки — my fault. Поставил и забыл.
>> неприятнее эрли навреное только оригинальный FMS.
1. Такие сравнения обычно аргументируют.
2. Это мой tool of choice и если мне нужен RTMP-сервер, выбор для меня однозначен.
3. Вы свободный человек и свободны содомировать red5 или crtmpd.
>> Это как надеть трусы на голову
Я предложил простой и доступный путь решения, исходя из известных мне инструментов(в которых я, кстати, более чем уверен). Any problems?
Обрадовался, что в заголовке указаны ссылки на мои статьи. На вторую статью все забили, поэтому даже желания писать третью нет.
По поводу джинглов и расписания: разбивка по категориям «утро», «день», «вечер», «ночь» конечно очень популярна, но не гибка. Зачастую нужно приделать категорию «выходной», «праздник», в новый год (скоро он примчится) надо разбавить весь плейлист новогодней музыкой, а порой делать вообще тематические дни. Или, допустим какой-то горячий хит должен играть круглосуточно — его по всем директориям распихивать?
Все вышесказанное касается не только музыки, но и джинглов, различных анонсов и прочих немузыкальных треков.
При генерации плейлистов используется рандом, данные которого никуда не записываются, ротацию построить не выйдет. Грубо говоря, если есть директория с полной дискографией Высоцкого, то в эфире будет только оно.
И да, у Liquidsoap хоть и много фич, но в данном случае ничего интересного с ним не увидел, используются штатные возможности, как у любой вещалки.
По поводу джинглов и расписания: разбивка по категориям «утро», «день», «вечер», «ночь» конечно очень популярна, но не гибка. Зачастую нужно приделать категорию «выходной», «праздник», в новый год (скоро он примчится) надо разбавить весь плейлист новогодней музыкой, а порой делать вообще тематические дни. Или, допустим какой-то горячий хит должен играть круглосуточно — его по всем директориям распихивать?
Все вышесказанное касается не только музыки, но и джинглов, различных анонсов и прочих немузыкальных треков.
При генерации плейлистов используется рандом, данные которого никуда не записываются, ротацию построить не выйдет. Грубо говоря, если есть директория с полной дискографией Высоцкого, то в эфире будет только оно.
И да, у Liquidsoap хоть и много фич, но в данном случае ничего интересного с ним не увидел, используются штатные возможности, как у любой вещалки.
Жаль, что желания нет, я бы с радостью почитал про обеспечение возможности удалённого прямого эфира, а ещё лучше с несколькими участниками одновременно. Начал делать это, дак забрёл аж в Asterisk.
Категории дополняются довольно просто, как «радиопередачи» в статье. Наверняка можно сделать проверку пустоты папки силами Liquidsoap, я в функциональную часть языка пока не лез. Горячие хиты можно оформить как информационные вставки (promo) в статье через
Рандомность местная мне тоже не по душе — буду реализовывать сам. Ротации как таковые пока не понадобились, но, быть может, тоже найдётся решение. Не через Liquidsoap, дак через Python.
Сейчас в голову пришло — скрипт на Python должно получиться заменить через тот же
Категории дополняются довольно просто, как «радиопередачи» в статье. Наверняка можно сделать проверку пустоты папки силами Liquidsoap, я в функциональную часть языка пока не лез. Горячие хиты можно оформить как информационные вставки (promo) в статье через
rotate()
. Дело в том, что расписание и формат определяю не я, а ответственный за это человек не знает, что понадобится через какое-то время. Пока что проблем с реализацией задуманного не было. Начинали мы вообще с IDJC и одной папки на все времена.Рандомность местная мне тоже не по душе — буду реализовывать сам. Ротации как таковые пока не понадобились, но, быть может, тоже найдётся решение. Не через Liquidsoap, дак через Python.
Сейчас в голову пришло — скрипт на Python должно получиться заменить через тот же
rotate()
. Почему сразу в голову не пришло — не понятно.Астериск (а лучше фрисвитч), мамбл и просто скайп умеют делать аудиоконфочки, мы написали еще Flash-чат для общения голосом, дабы можно было прямо из браузера вещать + собирать конференцию. Лайвы — это пожалуй главная и самая интересная часть любого вещания.
Ротация эфира (те самые категории с разбивками по дням недели, выходным, праздникам) с выборкой треков — это пожалуй самое сложное в создании станции. Многие напихают музыки, включат волшебный рандом и ВСЕ РАБОТАЕТ КРУТА ЧО. В вашем примере хоть немного контент выбирается.
Еще есть такая замечательная штука как войс-треки с диджейскими стонами, контент от сторонних ресурсов с автоматической врезкой в эфир (к примеру, горячий выпуск новостей — система берет голос, добавляет к нему подложку и заставки, все это пускает в эфир) и прочие скриптотворения. У нас самодельный микшер, который позволяет выбрасывать в эфир сразу несколько треков (музыка, заставки, голоса, телефонные звонки), можно скриптовать все от часовых отбивок, заканчивая синтезированным прогнозом погоды поверх трека.
Надо признаться, что я сам не осилил сделать ротацию в человеческом виде, ибо идеи на бумаге одни, а в эфире звучат несколько иначе, нежели задумывались изначально. Это нетехнический момент. Как ее сделать — я не знаю.
Ротация эфира (те самые категории с разбивками по дням недели, выходным, праздникам) с выборкой треков — это пожалуй самое сложное в создании станции. Многие напихают музыки, включат волшебный рандом и ВСЕ РАБОТАЕТ КРУТА ЧО. В вашем примере хоть немного контент выбирается.
Еще есть такая замечательная штука как войс-треки с диджейскими стонами, контент от сторонних ресурсов с автоматической врезкой в эфир (к примеру, горячий выпуск новостей — система берет голос, добавляет к нему подложку и заставки, все это пускает в эфир) и прочие скриптотворения. У нас самодельный микшер, который позволяет выбрасывать в эфир сразу несколько треков (музыка, заставки, голоса, телефонные звонки), можно скриптовать все от часовых отбивок, заканчивая синтезированным прогнозом погоды поверх трека.
Надо признаться, что я сам не осилил сделать ротацию в человеческом виде, ибо идеи на бумаге одни, а в эфире звучат несколько иначе, нежели задумывались изначально. Это нетехнический момент. Как ее сделать — я не знаю.
Да, я видел сравнения производительности Asterisk и FreeSwitch, но уже начал изучать и читать книгу о Asterisk. При этом сейчас и в обозримом будущем его хватит с головой — радио только начало свою работу, до многотысячной аудитории одновременно ещё ой как далеко. Главное, что это всё интересно :) Со временем будет всё разрастаться, будут применяться знания из разных категорий, скриптования, врезки, передачи, чёрт в ступе — всё будет, если понадобится. Было бы желание.
А желаний нет? Творческая импотенция?
Желание есть, но не вечно же будет длиться. Помимо обработки аудио, Liquidsoap ещё и видео умеет обрабатывать — сейчас параллельно и это изучаю, благо есть цель, к слову, не сложная — просто смешать картинки в слайдшоу, музыку в аудиопоток, текст из файла в бегущую строку и всё на IceCast. Искал аналоги — гугл считай не помог, на форумах ни одного поста не написали в ответ. Помимо этого, интеграция с тем же Asterisk'ом — непаханное поле уловок, нюансов, оптимизаций. Целей много, полёт творчества не скоро прервётся.
Я так и не смог найти хороших вещалок видео (не важно для какого протокола), дабы было все кроссплатформенно и желательно свободно.
От себя могу натолкнуть вас на freej.org, может быть интересно будет, по крайней мере посмотрите. Далее, оригинальный айскаст умеет стримить только теору, которая мало кому интересна, поэтому для стриминга видео вы наверное будете искать что-то еще (у меня была идиотская мысль добавить в айскаст поддержку WMV, но я от нее отказался).
Еще подскажу такую штуку как WireCast, более цельное решение, позволяет НУ ОЧЕНЬ много, чего-то больше — уже писать самим. Я вот видео не транслирую, смешивать картинки мне не надо, зато я вырезаю из видеопотока картиночки и пощщу на сайт — можно делать презентации. Но я и писал для себя серверную часть.
А астериск просто гейт/микшер голоса, один из многих.
От себя могу натолкнуть вас на freej.org, может быть интересно будет, по крайней мере посмотрите. Далее, оригинальный айскаст умеет стримить только теору, которая мало кому интересна, поэтому для стриминга видео вы наверное будете искать что-то еще (у меня была идиотская мысль добавить в айскаст поддержку WMV, но я от нее отказался).
Еще подскажу такую штуку как WireCast, более цельное решение, позволяет НУ ОЧЕНЬ много, чего-то больше — уже писать самим. Я вот видео не транслирую, смешивать картинки мне не надо, зато я вырезаю из видеопотока картиночки и пощщу на сайт — можно делать презентации. Но я и писал для себя серверную часть.
А астериск просто гейт/микшер голоса, один из многих.
[удалил]
Долго пытался понять, но почему-то с crossfade в эфир шла одна только тишина.
Позже разобрался, если до crossfade поставить mksafe, то воспроизведение идет как и положено.
Позже разобрался, если до crossfade поставить mksafe, то воспроизведение идет как и положено.
Я прошу прощения за идиотский вопрос, а как получить доступ к вещанию? На какой url ходить?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Интернет-радиостанция на Liquidsoap + IceCast