Тема: icecast2 + icegenerator на FreeBSD
Решил я попробовать сделать радио на 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 http://адрес_вашего_сайта:8000/radio.ogg в медиаплеер и наслаждаемся своими любимыми песнями.
Теперь некоторые мои наблюдения.
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.
Вот собственно и все.
Удачного радиовещания!
Выражаю благодарность авторам этих статей:
Инструкция по установке и настройке Icecast и Ices под Linux
http://igig.dp.ua/FreeBSD/icecast.html
Надеюсь, и моя статья кому-нибудь поможет создать свое радио.