Icecast2, Ices0 или как сделать?

Этой записью хочу открыть серию публикаций о нюансах настройки различных сервисов на *nix системах. Сильных отличий в настройке на FreeBSD или Linux нет.

И первая запись будет посвящена конфигурационному файлу Icecast2 и всему остальному, что с этим будет связано.

Icecast2 представляет из себя сервер потокового вещания. Я его использую для трансляции mp3 файлов с помощью Ices0.

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

Для подключения диджея нам нужно просто организовать 2 потока, основной и резервный. На резервном потоке постоянно транслируется наша музыкальная программа, которую мы организовали с помощью Ices0.

Обратим внимание на секцию <mount> в конфигурационном файле icecast2, которая делает возможной нашу задумку и решает одну из задач:

<mount>
<!— В эту точку монтируется поток вещания для диджея —>
<mount-name>/online.mp3</mount-name>
<max-listeners>100</max-listeners>
<max-listener-duration>3600</max-listener-duration>
<!— Файл intro должен находится в каталоге web root icecast2 —>
<intro>/intro.mp3</intro>
<!— В эту точку монтируется основной музыкальный поток —>
<fallback-mount>/music.mp3</fallback-mount>
<fallback-override>1</fallback-override>
<fallback-when-full>1</fallback-when-full>
</mount>

Ваши слушатели и диджей подключаются к Вашему серверу через url http://your.station.muz/online.mp3.m3u
Когда диджей «активен», у него идет эфир, то клиенты слышат то, что он вещает, как только он отключится, то сразу в эту точку монтирования пойдет поток из точки /music.mp3

Все вновь подключенные клиенты будут слышать в начале файл intro.mp3, а затем будут слышать основной эфир радио.

Теперь как настроить Ices0 для того, чтобы он мог «гнать» поток в Icecast2

<Stream>
<Server>
<Hostname>localhost</Hostname>
<Port>8000</Port>
<!— должен совпадать с паролем из секции authentication конфигурационного файла icecsat2 —>
<Password>123</Password>
<Protocol>http</Protocol>
</Server>
<!— Из этой точки Icecsat2 читает основной музыкальный поток —>
<Mountpoint>/music.mp3</Mountpoint>
<URL>http://localhost/</URL>
<Public>0</Public>

<Bitrate>128</Bitrate>
<Reencode>1</Reencode>
<Channels>2</Channels>
</Stream>

Здесь мы организовали поток на localhost с битрейтом 128, который получается «на лету». Т.е. вы можете заставить Ices0 читать файл с меньшим или большим битрейтом, он его конвертирует в 128 и выдаст этот поток в эфир.

На этом почти все, но осталась задача с почасовой отбивкой. Она организуется с помощью скрипта написанного на перл или питоне. Что нам это дает? Основное преимущество — это динамическое изменение плейлиста. Теперь мы сможем добавлять новые или удалять старые файлы mp3 и нам не нужно будет перезапускать сервис Ices0.

Для начала вносим изменение в конфигурацию Ices0, в раздел Playlist

  <Playlist>
<!— Эти строчки нам больше не нужны
<File>playlist.txt</File>
<Randomize>1</Randomize>
<Type>builtin</Type>
Вместо них будет эта —>
<Type>perl</Type>
<Module>ices</Module>
<Crossfade>5</Crossfade>
</Playlist>

Теперь идем в каталог /usr/local/etc/modules Здесь должен лежать файл ices.pm — скрипт управления плейлистом. Он должен лежать здесь и обязательно иметь название ices.pm. (хотя, если «собирать» этот сервис в «ручную», скорее всего можно указать свои параметры, но сейчас не об этом).

в начале файла добавим два модуля

use MP3::Info;
use Math::Random;

Дальше нас будет интересовать только ф-ция «ices_get_next»

Привожу ее листинг с комментариями:

sub ices_get_next {
# определяем время когда ices0 обращается к скрипту
my ($s, $m, $h, $day, $month, $year) = ( localtime )[0,1,2,3,4,5];
$date = sprintf («%04d-%02d-%02d %02d:%02d:%02d», $year+1900, $month+1, $day, $h, $m, $s);
# Для отбивки каждого часа проверяем не наступил ли тот самый момент, собственно поэтому время нам и нужно
if ($m == 59 && $s > 54) {
$music = «/var/ices/curanty.mp3»;
# Проверяем на месте файл или его нет. Если его нет, то играем основную программу
if (-e $music) {
return (( $music )[0]);
}
else {
# смотрим ниже
track();
}
}
else {
# смотрим ниже
track();
}
}
# Здесь у нас и обрабатывается основная музыкальная программа
sub track {
$num=`/bin/ls /var/ices/muz/*.mp3 | /usr/bin/wc -l`;
@music=`/bin/ls -1 /var/ices/muz/*.mp3`;
$oldplay = $play;
# Выбираем случайным образом номер файла
$play=int(random_uniform(1, 0, $num));
# Если вдруг нам так повезло и повторно выпал номер играющего файла, то попытаемся снова выбрать случайный файл
if ($oldplay == $play) {
$play=int(random_uniform(1, 0, $num));
}
chomp $music[$play];
# Достаем TAG из mp3 файла
my $tag = get_mp3tag($music[$play]) or die «no»;
if ($tag != «no») {
$artist_name = $tag->{ARTIST};
$songtitle = $tag->{TITLE};
}
else {

# Если нет TAG в файле
$artist_name = «My Radio»;
$songtitle = «Welcome!»;
}
return $music[$play];
}

Обратим внимание еще на две функции и что они возвращают:

sub ices_get_metadata {
return $artist_name.» — «.$songtitle;
}

sub ices_get_lineno {
return $play;
}

И в завершении файла возвращаем 1;

Все. Работа с конфигурационными файлами покончена. Теперь нам нужно каким то образом заставить Ices0 в нужное время прочитать получившейся перловый скрипт.

Здесь к нам на помощь приходит cron. Добавим в задания следующую строчку:

59      *       *       *       *       /path/ices0-reload.sh

И создадим файл ices0-reload.sh, который будет выполнять оставшуюся «грязную» работу.
Файл содержит несколько строк:

# засыпаем до конца часа, почти на минуту
sleep 55
# определяем номер PID-а
PID=`cat /var/log/ices0/ices.pid`
# Перегружаем Ices0 или заставляем его перейти к следующей композиции.
/bin/kill -USR1 ${PID}

Вот на этом с организацией, почти профессиональной онлайн радио станции, мне хотелось бы закончить.

Да! И чуть не забыл. В начале файла для почасовой отбивки я вставил 5 сек. тишины, чтобы нормально отработал 5 секундный Crossfade

UPD
Если Вы будете использовать директиву: <max-listener-duration>3600</max-listener-duration>
в конфигурационном файле Icecast2 в разделе <mount>, то клиенты будут отключены от радио ровно через час.
Увеличивать или уменьшать не имеет смысла, не работает. Строчку лучше удалить, если не нужно отключать клиентов.

UPD2
Для анализа работы программ включите логирование у сервисов:
Добавьте в конфиг Ices0 строки

<Execution>
<Background>1</Background>
<Verbose>1</Verbose>
<BaseDirectory>/var/log</BaseDirectory>
</Execution>

В конфиг Icecast2

<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<!— 4 Debug, 3 Info, 2 Warn, 1 Error —>
<loglevel>2</loglevel>
<logsize>10000</logsize>
</logging>

Реклама

41 thoughts on “Icecast2, Ices0 или как сделать?

  1. Приветик
    30 раз все сделал как написали, перепроверил но к сожалению не работает. Толи вы что либо упустили, толи не дописали не понятно. Сможите помочь?

    Статья очень грамотная, решающая задачу ту, которую нужно.

      • Проблема в том, что открывается само окно Icecast2 Admin, конектится к нему запросто программа SAM , но не могу вывести ссылку на прослушивание, попросту 403 ошибка, сломал всю голову, может вы листинг посмотрите? Или я могу доступ дать. И никак не пойму куда именно кидать сами муз. файлы и где именно должен лежать файл интро. Если у вас скайп или маил агент есть свяжитесь пожалуйста

  2. Я специально для радио сервер арендовал, а все никак немогу понять что не так ((

  3. я поясню почему прошу помощи, дело в том что вы специалист. Второе есть в статье неточность, возможно это связанно с новой версией icecast2 ( в конфиге нет чистой секции ) там секций несколько Плюс есть вопросы по другим секциям, рассчитываю на вашу помощь, заранее спасибо

  4. вот сюда /var/ices/curanty.mp3 — кладем почасовую отбивку
    вот сюда /var/ices/muz/*.mp3 — кладем все мп3 файлы

    логика простая. вначале запускаем ices0 — если он работает, то половина работы уже сделана. icecast2 считывает поток данных, которые транслирует ices0. Для подключения SAM-а нужно создать еще одну точку, которая имеет более высокий приоритет для icecast2. К этой, второй точке и надо настраивать СЭМа. как только на ней будут данные icecast2 переключится на нее.

    • /var/ices -нет там такой папки, я запутался с секцией paths
      А как запускать отдельно ices0?? Может проще посмотрите? Я уж и иностранную инструкцию всю изучил, не получается…хоть убейте
      плеер не выводится. может чего не хватает на сервере? Я рутовый дам доступ, только тут его писать не буду, а почта отбивочная….

  5. секции моунт их в конфиге несколько под комментариями, какой открывать?
    —mount type=»default— mount type=»normal»—

    Былобы руководство пошагово. что и как и где создавать, там же еще надо добавлять пользователя и группу…и еще кучу всего

  6. Вот забыл, иностранцы выпустили новую версию Icecast Release 2.5 beta1 стоит ли заморачиваться обновлять?

  7. К сожалению, нет времени «смотреть».

    Вы понимаете, что такое примеры? Я не публиковал реальные пути к файлам на своем сервере. Если нет этих каталогов, то создайте их! Больших проблем не вижу. На другие вопросы, не люблю так поступать, но рекомендую почитать документацию к операционной системе, которую используете.

    Чтобы обновлять с версии на версию, рекомендую почитать список изменений. Если эти изменения Вам необходимы, то рекомендуется обновить версию ПО, если нет, то нет.

  8. так я создам не проблема. но как заставить медиасервер их увидеть? Не найду в конфиге этого где пути прописываются….

  9. Вам нужно разобраться в понятиях. Что такое точка монтирования потока, что такое путь к файлам. Вы все свалили в кучу, поэтому запутались.

  10. да запутался. читаю документацию иностранцев с помощью гугл переводчика и много чего не понимаю….я опять с нуля пробую и пробую …не получается вообще запустить теперь Icecast2.
    То при запуске требовал файл на сервере mime.types, файл в инете скачал, подсунул. теперь ошибку пишет Starting icecast2
    Detaching from the console
    root@radio:~ # ERROR: You should not run icecast2 as root
    Use the changeowner directive in the config file

    Жаль в инете нет ни одной нормальной статьи чтоб с нуля все описалии и до рабочего состояния…У вас статья для спецов, а я нюб.

  11. Вы одно поймите, такие как я и ищем помощи в инете чтоб с чем либо разобраться досконально и знать…Мне реально нужно это, стою на месте какой день…не понимая в чем я ошибаюсь..

  12. давайте я попробую конкретнее то, что непонятно, а именно секция mount
    У вас в примере в этой секции отсуствуют многие строки которые есть в самом конфиге а именно: (скобки не проходят поэтому без них..)

    username othersource username
    password hackmemore password
    dump-file tmp/dump-example1.ogg dump-file
    burst-size 65536 burst-size

    authentication type=»htpasswd»
    option name=»filename» value=»myauth»
    option name=»allow_duplicate_users» value=»0″
    authentication
    http-headers
    header name=»Access-Control-Allow-Origin» value=»http://webplayer.example.org»
    header name=»baz» value=»quux»
    http-headers

    on-connect /home/icecast/bin/stream-start on-connect
    on-disconnect /home/icecast/bin/stream-stop on-disconnect

    Что делать со всем этим??? по умолчанию там это есть после того как раскоменитровал моунт

    А так же у вас в примере есть строка которой нет в конфиге

    max-listener-duration 3600 max-listener-duration

    Вы поймите, все эти несоотвенствия и вводят в заблуждение.. Заранее спасибо за ответ

  13. Бился бился, всё без толку…
    Возможно выложить полный рабочий конфиг icecast.xml и ices.conf ? Или прислать на почту.

    Если так не получается, для кого тогда написана эта статья? Уверен что знающие грамотные програмисты и без этого обойдуться….А чайники просто не разберуться.

  14. Смысл есть всегда. Вы пока путаетесь в обычных понятиях. Не понимаете какая программа, что должна делать. Я перестал Вам отвечать т.к. статья не о том как запустить ices0 и icecast2. Вы даже этого не смогли понять просто почитав документацию на сайте разработчика. Попытались просто скопировать мой конфиг и считаете, что он заработает. Так не бывает. У каждого администратора «своя» система, заметили, что я даже не стал спрашивать Вас об этом?
    Я попытался Вам помочь, но Вы не захотели прислушиваться к моим советам.

  15. Я уже не путаюсь, и не надо совсем делать из меня идиота… Если вы пишите статью, начните с тех.требований к серверу, что помимо еще нужно (например библиотеки и т.д.) Плюс я выше писал что в статье куча неточностей или просто нет пояснений. Просто задумайтесь для кого такая статья? А про помощь, вы же выше написали что вам некогда посмотреть конфиг и указать на ошибку. Не надо говорить о попытке помощи…

  16. Здесь приведены части рабочих конфигов. Статья написана для меня самого, чтобы в будущем не вспоминать что, да как. Плюс она писалась не для тех целей, для которых Вы пытаетесь ее применить. Еще раз. Эта статья показывает как «прикрутить» перловый скрипт в Ices0, а не о том, что и так написано на сайте разработчика.
    Если Вас она не устраивает, то гугл или любая другая поисковая система Вам поможет найти точные копии конфигов, которые, возможно, слету заработают на Вашем сервере.

  17. Ощущение что говорим на разных языках. Да у меня свои конфиги, суть в том что Ices0 с помощью перла не подцепляется к Icecast2, (тоесть суть самой статьи этой не работает) Как бы мне этого не хотелось…

  18. Причем здесь перл и монтирования потока в Icecast2? Перл обрабатывает листинг того, что должен воспроизводить Ices0
    Упростите свои конфиги до самого начального уровня. Ответьте для себя на вопросы:
    1. Куда Ices0 транслирует поток?
    2. У Вас Ices0 работает?
    3. От куда Icecast2 пытается читать поток?
    4. Посмотрите на вывод команды netstat, что в логах Icecast2, Ices0?

    Добавьте в конфиг Ices0 строки с логами (это все написано подробно на сайте разработчика). В конфиг Icecast2 увеличьте логирование до дебага. Добавил в статью UPD2 со строками логирования сервисов

    Вы с самого начала «копаете» не в ту сторону.

  19. Хорошо начну с начала чтоб понять почему не получается. Разберу Icecast2 с родным конфигом (все секции моунт закомментированы). По умолчанию все запускается, http;//урл_моего сайта:8000/status.xsl видит вэб интерфейс, программа SAM подцепляется к Icecast2 с точкой монтирования /live.

    Раскоментировал моунт и создал точки монтирования /online.mp3 /music.mp3 /intro.mp3, перезапустил сервер и вот самое главное. !! Программа SAM опять подмонтируется в точку монтирования /Live

    Почему Icecast2 не видит другие точки монтирования? Это может быть связанно с названиями секций монтирования? mount type=»default mount type=»normal . Откуда берется где она прописана это точка монтирования /Live

    • Далее, например в программе источника SAM меняю точку монтирования на /live00, все равно он подцепляется к Icecast2, видит то что в него транслируется но уже по другому адресу можно прослушать http;//айпи сервера:8000/live00

  20. далее.. я естественно читаю документацию производителя, но с помощью гугл переводчика много чего непонятно. Я вас прошу выложить полностью конфиг чтоб посмотреть что и как. К примеру не совсем ясно некоторые секции, такие как listen-socket (одна она должна быть, с одним портом, нужно ли там указывать bind-address и shoutcast-mount )

  21. Эх…сколько не бился, ну никак не хочет как описано в статье Ices0 транслировать поток..

    root@radio:~ # ices -c /usr/local/etc/ices.conf
    Into the land of the dreaded daemons we go… (pid: 863)

    и добавил ведение логов строчку, и права на файлик а в логах непонятно что

    Logfile opened
    DEBUG: Sending following information to libshout:
    DEBUG: Stream: 0
    DEBUG: Host: localhost:8000 (protocol: http)
    DEBUG: Mount: /music.mp3, Password: 123
    DEBUG: Name: Default stream URL: http://localhost/
    DEBUG: Genre: Default genre Desc: Default description
    DEBUG: Bitrate: 128 Public: 0
    DEBUG: Dump file: (null)
    DEBUG: Initializing playlist handler…
    DEBUG: Importing perl module: ices
    DEBUG: perl_parse() error: parse problem
    Initialization of playlist handler failed. []
    Ices Exiting..

    Всё. уже не знаю в какую сторону копать..надо найти альтернативу наверное.. Просто шляпа получается..

  22. есть предположения что это все из за 64 битной системы или чего то не хватает на сервере….Уж великий всемогщчий, может посмотрите найдете пяток минуток? мне так нужна ваша помощь….

  23. Вот здесь ошибка:
    DEBUG: Importing perl module: ices
    DEBUG: perl_parse() error: parse problem

    Поэтому ices0 не стартует. Отключите перл и сделайте «простой», штатный плейлист. Пусть ices0 читает, для начала, без всяких перлов.
    Если все заработает, то можно начать прикручивать перл.
    Повторюсь. Для начала надо запустить все в простом варианте, а потом уже прикручивать «навороты».
    Кстати, перл нужен исключительно для генерации плейлиста и не более. на подключение диджея он никаким боком не влияет.

  24. Всё, наизнанку уже вывернул, не хочет Ices0 он и в простом варианте монтироваться… реально уже не знаю что делать…. напиши плиз мне на почту…или мне на эту написать? comment-reply@wordpress.com

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s