ОсновноеRadiotalkПользовательское
Общие вопросы по интернет радио вещанию
6   •   Посмотреть все темы

icecast2 + icegenerator на FreeBSD

 

9
irr @irr
Решил я попробовать сделать радио на VDS. Лишний трафик есть, место есть - думаю почему бы не залить туда музыку и пусть бы себе играла. Прочитал про связку icecast2 + ices, начал разбираться, и в общем ices мне не понравился. Какие сразу минусы бросились в глаза:
1) Когда радио никто не слушает, ices не вещает. Т.е. если в данный момент всего один слушатель, ему не понравилась песня и он выключил радио на 5 минут а потом опять включил - играть будет с того же места. То что на сайте при отсутствии слушателей будет показываться что якобы все время играет одна и та же песня - тоже не дело.
2) Для воспроизведения mp3 и ogg нужно ставить совершенно разные пакеты - ices0 и ices2 соответственно, причем с разными конфигами. Кроме того, ices2 (в отличие от ices0) постоянно кушает процессор. На моей домашней машине он потреблял стабильно 3% от Q9300... сколько это будет на VDS с процессором 300 Mhz я не проверял, но сам факт меня насторожил).
Забегая вперед, сразу скажу что у icegenerator нет этих двух проблем. Кроме того, из плюсов стоит отметить:
1) Для icegenerator не нужно составлять плейлист, достаточно указать папку с музыкой.
2) Удобный лог-файл, в который пишется дата, время, и какая песня начала играть. Т.е. не нужно мутить какие-то скрипты для парсинга icecast, здесь все намного проще:
# tail -n 30 icegenerator.log
- и получаем список последних 30 песен игравших на радио.
3) Минимальное потребление процессора и памяти.

Итак, если заинтересовало - читаем дальше ).

Установка icecast2 на FreeBSD с автоматической сборкой из исходников:
# cd /usr/ports/audio/icecast2/ && make install clean
либо установка готового пакета:
# pkg_add -r icecast2

Расписывать подробно про конфиг icecast не буду - это уже делалось и до меня, привожу простой рабочий пример. То что вписано русскими буквами - меняйте на свое.

---------------- начало файла ----------------
<icecast>
<limits>
<clients>100</clients>
<sources>2</sources>
<threadpool>5</threadpool>
<queue-size>524288</queue-size>
<client-timeout>30</client-timeout>
<header-timeout>15</header-timeout>
<source-timeout>10</source-timeout>
<burst-on-connect>1</burst-on-connect>
<burst-size>65535</burst-size>
</limits>

<authentication>
<source-password>ваш_пароль</source-password>
<relay-password>ваш_пароль</relay-password>
<admin-user>admin</admin-user>
<admin-password>ваш_пароль</admin-password>
</authentication>

<shoutcast-mount>/radio.ogg</shoutcast-mount>

<hostname>имя_вашего_сайта</hostname>

<listen-socket>
<port>8000</port>
<bind-address>айпи_вашего_сервера</bind-address>
</listen-socket>

<fileserve>1</fileserve>

<paths>
<basedir>/usr/local/share/icecast</basedir>
<logdir>/var/log/icecast</logdir>
<webroot>/usr/local/share/icecast/web</webroot>
<adminroot>/usr/local/share/icecast/admin</adminroot>
<alias source="/" dest="/status.xsl"/>
</paths>

<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<loglevel>2</loglevel>
<logsize>1000</logsize>
<logarchive>1</logarchive>
</logging>

<security>
<chroot>0</chroot>
<changeowner>
<user>nobody</user>
<group>nogroup</group>
</changeowner>
</security>
</icecast>
---------------- конец файла ----------------

Сохраняем его в файл /usr/local/etc/icecast.xml. Далее, создаем папку /var/log/icecast, разрешаем туда писать пользователю nobody, затем дописываем в /etc/rc.conf строчки:
icecast_enable="YES"
icecast_flags="-b -c /usr/local/etc/icecast.xml"

и запускаем icecast:
# /usr/local/etc/rc.d/icecast2 start

проверяем что он запустился:
# ps aux | grep icecast2
и если не видим такого процесса - смотрим лог-файл /var/log/icecast/error.log. Если и там пусто - значит не дали права на запись в этот файл ;).

Итак, с icecast-ом мы покончили. Теперь займемся icegenerator. Установка со сборкой из исходников:
# cd /usr/ports/audio/icegenerator/ && make install clean
либо установка готового пакета:
# pkg_add -r icegenerator

Конфиг icegenerator с комментариями:

---------------- начало файла ----------------

# - это комментарий

# Айпи
IP=айпи_вашего_сервера

# Порт
PORT=8000

# Версия сервера icecast
# 1 - Icecast 1.3.21 or Shoutcast (ICY protocol compatible)
# 2 - Icecast 2.0 (HTTP protocol compatible)
# Мы устанавливали icecast2, поэтому:
SERVER=2

# Точка монтирования
# Должна соответствовать тому что указано в конфиге icecast
# (у нас там указано /radio.ogg)
# Некоторые плееры не умеют автоматически определять формат потока,
# поэтому точка монтирования желательно должна заканчиваться
# на .mp3 или .ogg, в зависимости от того что вещаем.
MOUNT=/radio.ogg


# Данные для подключения к icecast

# Имя источника
# обычно source, у нас так же:
SOURCE=source

# Пароль
# должен соответствовать тому что в конфиге icecast
PASSWORD=ваш_пароль


# Файлы и плейлист

# Формат потока
# 0 - Ogg Vorbis
# 1 - MP3
# в нашем примере - ogg
FORMAT=0

# Месторасположение файлов
# icegenerator поддерживает массу различных способов указания
# местоположения файлов - можно и плелист от винампа дать, можно
# настроить подключение к MySQL или Postgres и брать данные
# оттуда - более подробно описано в оригинальном конфиге
# но по-моему проще всего указать папку где лежат файлы:
MP3PATH=pth:/home/имя_пользователя/music

# Просматривать ли директории рекурсивно - да
RECURSIVE=1

# Файл для записи радио на сервер - мне не нужно
DUMPFILE=

# Запустить ли заново после того как кончится плейлист - да
LOOP=1

# Перемешивать ли плейлист перед запуском - да
SHUFFLE=1


# Информация про радио

# Название радиостанции
NAME=моя_радиостанция

# Жанр музыки
GENRE=жанр

# Описание радиостанции
DESCRIPTION=описание_моей_радиостанции

# URL радиостанции
URL=url_радиостанции

# Битрейт потока
# не оказывает никакого влияния на реальный битрейт
BITRATE=64000

# Добавить ли радио в публичный список
PUBLIC=0

# Периодичность обновления метаданных
# тут либо косяк в программе, либо я чего-то не понимаю
# комментарии по этому поводу - в конце статьи
# для ogg обязательно ставьте 0
METAUPDATE=0

# Местоположение глобального файла метаданных
# комментарии также смотрите в конце статьи
#MDFPATH=/home/имя_пользователя/music/global.mdf


# Логирование и отладка

# Куда писать лог
# 0 - никуда
# 1 - в системный лог
# 2 - в отдельный файл
# удобнее конечно последний вариант
LOG=2

# Путь к логфайлу
# можно в ту же папку где логи icecast, а можно допустим в
# домашнюю директорию своего сайта, чтобы парсить его там же
# не отходя от кассы :). особенно если не хотите ПО веб-сервера
# давать доступ в /var/log/icecast/
LOGPATH=/var/log/icecast/icegenerator.log


# Управление icegenerator через telnet

# icegenerator-ом можно управлять через telnet, но команд очень
# мало и они на мой взгляд бесполезны (получить название трека,
# перемешать плейлист и т.д.). рекомендую ничего тут не указывать

DATAPORT=

---------------- конец файла ----------------

Сохраняем этот конфиг в /usr/local/etc/icegenerator.conf

Теперь, одна неприятная неожиданность, но у icegenerator нет скрипта запуска, поэтому пишем его самостоятельно:

---------------- начало файла ----------------
#!/bin/sh
#
# $FreeBSD: ports/audio/icegenerator/files/icegenerator.sh.in,v 1.2 2006/07/10 18:32:31 dougb Exp $
#

# PROVIDE: icegenerator
# REQUIRE: DAEMON
# BEFORE: login
# KEYWORD: shutdown

# Add the following line to /etc/rc.conf to enable `icegenerator':
#
#icegenerator_enable="YES"
#icegenerator_flags=""
#

. "/etc/rc.subr"

name="icegenerator"
rcvar=`set_rcvar`

command="/usr/local/bin/$name"
command_args="1>/dev/null 2>&1"
required_files="/usr/local/etc/icegenerator.conf"
sig_stop=KILL

# read configuration and set defaults
load_rc_config "$name"
: ${icegenerator_enable="NO"}
: ${icegenerator_flags=""}

run_rc_command "$1"
---------------- конец файла ----------------

сохраняем в /usr/local/etc/rc.d/icegenerator и даем права на исполнение.

И еще один момент, который следует учесть: icegenerator должен запускаться после icecast, иначе он не заработает. Поэтому внесем небольшое изменение в скрипт запуска icecast-а /usr/local/etc/rc.d/icecast2:
строчку
# BEFORE: login
необходимо изменить на
# BEFORE: icegenerator

Таким образом в случае перезагрузки сервера сначала будет стартовать icecast, потом icegenerator.

Теперь снова открываем файл /etc/rc.conf, добавляем
icegenerator_enable="YES"

после чего даем команду:
# /usr/local/etc/rc.d/icegenerator start

и проверяем что он запустился:
# ps aux | grep icegenerator
и если не видим такого процесса - смотрим лог-файл /var/log/icecast/icegenerator.log. Если и там пусто - значит не дали права на запись в этот файл ;).

Если все нормально, то добавляем url ********** в медиаплеер и наслаждаемся своими любимыми песнями.

Теперь некоторые мои наблюдения.
1) По умолчанию, в конфиге параметр METAUPDATE=5. Для MP3 можно так и оставить. Для OGG - измените на 0, иначе вместо единого потока будут идти кусочки по 5 секунд, а также в лог icecast-а каждые 5 секунд будет сообщаться что к нему подключился icegenerator. Не все плееры такое нормально играют, а лог-файл довольно быстро разрастается.
Почему так - не знаю. То ли ошибка в icegenerator, то ли я чего-то недопонял. В исходниках программы есть файл README.IceMetaL, в котором описывается про создание отдельных файлов с метаданными. Возможно надо копать в эту сторону.
А можно поставить METAUPDATE=0. Единственное что я заметил - это то что в этом случае если в ogg-файле нету тегов, то имя файла вместо тега не передается. Так что заполняем теги ;).
2) Теги у ogg-файлов можно редактировать удаленно прямо на сервере, поставив пакет vorbis-tools. И еще, в случае с ogg если заполнены теги TITLE и ARTIST, то WinAMP показывает только TITLE, а ARTIST надо смотреть в свойствах файла. Чтобы не создавать такие неудобства для слушателей, пишем и исполнителя и название песни в тег "TITLE".
# vorbiscomment -w -t "TITLE=Исполнитель - Песня" "имя_файла.ogg"
Теги у mp3 конечно тоже можно править удаленно. Но пакет для этого не искал, т.к. целенаправленно решил транслировать ogg.
3) icegenerator стабилен и сам по себе не падает. Но видимо все же есть некоторые исключения. Например если в конце трека есть пауза более 10 секунд, то он таки отваливается.
Чтобы обезопасить себя от подобных неприятностей, я написал вот такой небольшой скриптик:

---------------- начало файла ----------------
#!/bin/sh

chkserv=`pgrep icegenerator`

if [ -z ${chkserv} ]; then
/usr/local/etc/rc.d/icegenerator restart
date >> /var/log/icecast/icegenerator-fail.log
fi
---------------- конец файла ----------------

Скрипт проверяет запущен ли icegenerator, в случае чего поднимает и записывает дату падения в icegenerator-fail.log.
Потом по времени падения можно свериться с icegenerator.log какая песня в этот момент играла, открыть соответствующий файл в каком-нибудь звуковом редакторе (например Audacity) и посмотреть что с ней не так.

4) Желательно чтобы все ogg-файлы были предварительно закодированы с одними и теми же параметрами. Например только так:
# oggenc -q0 "имя_файла.wav"
или так:
# oggenc -m64 -M64 "имя_файла.wav"
или как-то иначе. Солянку лучше не делать. Из-за этого наблюдал проблемы например в плеере Amarok.


Вот собственно и все.
Удачного радиовещания!

Выражаю благодарность авторам этих статей:
**********
**********

Надеюсь, и моя статья кому-нибудь поможет создать свое радио.

1400
Pheoru @Pheoru
1) Когда радио никто не слушает, ices не вещает. Т.е. если в данный момент всего один слушатель, ему не понравилась песня и он выключил радио на 5 минут а потом опять включил - играть будет с того же места. То что на сайте при отсутствии слушателей будет показываться что якобы все время играет одна и та же песня - тоже не дело.

Это бред.
2) Удобный лог-файл, в который пишется дата, время, и какая песня начала играть. Т.е. не нужно мутить какие-то скрипты для парсинга icecast, здесь все намного проще:
# tail -n 30 icegenerator.log
- и получаем список последних 30 песен игравших на радио.

У айсеса есть офигительный лог-файл, все настраивается в конфиге.
Вы, по-видимому, вообще не разобрались в возможностях ices, и сразу кинулись на другой стример.

Мануал, думаю, пригодится.

9
irr @irr
спасибо за замечания.
бред наверное лучше убрать. только не вижу тут кнопки для редактирования сообщения.

9
irr @irr
вчера переносил радио на другой VDS - там CentOS на технологии виртуализации OpenVZ. так вот собрав icegenerator, обнаружилось что он запрашивает себе 32 mb памяти (при реальном потреблении всего 1 mb). для OpenVZ, который как раз подсчитывает запрашиваемую память, на небольших тарифах это конечно многовато. решил для альтернативы собрать ices2 - он сожрал 16 mb :). тоже немало, но все-таки в 2 раза меньше.

пришлось осваивать ices :)

в общем, повторю свой вопрос к админам - как бы мне отредактировать мой мануал? если нет такой возможности, то может тему грохните, а я заново запощу с исправлениями?

1400
Pheoru @Pheoru
Вы запостите прямо здесь, а мы потом откорректируем первое сообщение.

2
zloiia @zloiia
очень полезная статья... только одно НО есть... создал скрипт запуска icegenerator. Засунул его в /usr/local/ect/rc.d/ . В /etc/rc.conf прописал, что
icegenerator_enable="YES"

.

Однако при попытке запустить оный выдается такая ошибка
%/usr/local/etc/rc.d/icegenerator start
/usr/local/etc/rc.d/icegenerator: Command not found.

чем лечить?

1400
Pheoru @Pheoru
Вы уверены, что у него есть загрузочный скрипт?
Попробуйте создать ярлык на /usr/local/bin/icegenerator (или где он там лежит) в /usr/local/etc/rc.d

2
zloiia @zloiia
проблема решилась тривиальнее... просто вводом команды
icegenerator

44
alpha_Qu4z4r @alpha_Qu4z4r
На самом деле проблема скорее всего была в отсутствии прав на запуск стратового скрипта =)

Спс за статью, хотя мне понадобился лишь чекер запущенности генератора.
В статье, кстати есть ещё ошибка про BEFORE, там нужно писать айскаст, а не айсгенератор, но это скорее всего просто от невнимательности.

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

1 трек тупо обрывается в 00 минут и начинает играть другой плэйлист, при этом нет никакой отбивки или джингла, хотя теоретически можно было бы что-то замутить на минуту и по крону в 01 минуту запускать уже плэйлист, но это тоже не шик.

2 Хотелось бы трэки играть определённым образом, типа в начале часа хит, через три трека хит на 4-ку ну и тд, примерно как это делается на крутых ФМ станциях, где трэки, конечно, выбираются рэндомно, но на основе рэйтингов. Но в icegenerator нет и намёка на такие вещи.

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

Кто как решал эти проблемы?

Отредактировано alpha_Qu4z4r - 15.01.2010
6245
Тарас @tarasian666
с помощью sc_trans 2 и cron
в определенное время cron подкидует нужный плейлист, а транскодер после завершения песни играет подкинутый плейлист

44
alpha_Qu4z4r @alpha_Qu4z4r
хмм, а с айскастом оно работает?

6245
Тарас @tarasian666
работает но почему то глюк с тегами, не отображаются

1
Denjan @Denjan
Показать текст


А куда этот скриптег запихивать?

6245
Тарас @tarasian666
куда нибуть, а запускать я полагаю надо кроном через каждые 10 сек

4
Disabled @Disabled
Доброго времени суток. Установил всё по мануалу.

icecast2 запускается нормально. 78.108.87.78:8001 - web

А вот с icegeneranor непонятно.

После установки и настройки по мануалу , запускаю его

# /usr/local/etc/rc.d/icegenerator start

но ничего не происходит (см. скриншот)


Скажите куда копать.

Спасибо, с ув. Александр

Отредактировано Disabled - 16.01.2012
6245
Тарас @tarasian666
смотрим сюда /var/log/icecast/icegenerator.log

4
Disabled @Disabled
tarasian666 пишет:

смотрим сюда /var/log/icecast/icegenerator.log


К сожалению логи пустые.


6245
Тарас @tarasian666
Если и там пусто - значит не дали права на запись в этот файл .

4
Disabled @Disabled
tarasian666 пишет:

Если и там пусто - значит не дали права на запись в этот файл .


Права абсолютно такие же как и на icecast2 .

6245
Тарас @tarasian666
а запускаються от разных пользователей
поменяйте права с 644 на 666