1

Тема: 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. Если и там пусто - значит не дали права на запись в этот файл wink.

Итак, с 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, а можно допустим в
# домашнюю директорию своего сайта, чтобы парсить его там же
# не отходя от кассы smile. особенно если не хотите ПО веб-сервера
# давать доступ в /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. Если и там пусто - значит не дали права на запись в этот файл wink.

Если все нормально, то добавляем url http://адрес_вашего_сайта:8000/radio.ogg в медиаплеер и наслаждаемся своими любимыми песнями.

Теперь некоторые мои наблюдения.
1) По умолчанию, в конфиге параметр METAUPDATE=5. Для MP3 можно так и оставить. Для OGG - измените на 0, иначе вместо единого потока будут идти кусочки по 5 секунд, а также в лог icecast-а каждые 5 секунд будет сообщаться что к нему подключился icegenerator. Не все плееры такое нормально играют, а лог-файл довольно быстро разрастается.
Почему так - не знаю. То ли ошибка в icegenerator, то ли я чего-то недопонял. В исходниках программы есть файл README.IceMetaL, в котором описывается про создание отдельных файлов с метаданными. Возможно надо копать в эту сторону.
А можно поставить METAUPDATE=0. Единственное что я заметил - это то что в этом случае если в ogg-файле нету тегов, то имя файла вместо тега не передается. Так что заполняем теги wink.
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

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

2

Re: icecast2 + icegenerator на FreeBSD

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

Это бред.

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

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

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

3

Re: icecast2 + icegenerator на FreeBSD

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

4

Re: icecast2 + icegenerator на FreeBSD

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

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

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

5

Re: icecast2 + icegenerator на FreeBSD

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

6

Re: icecast2 + icegenerator на FreeBSD

очень полезная статья... только одно НО есть... создал скрипт запуска 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.

чем лечить?

7

Re: icecast2 + icegenerator на FreeBSD

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

8

Re: icecast2 + icegenerator на FreeBSD

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

icegenerator

9

Re: icecast2 + icegenerator на FreeBSD

На самом деле проблема скорее всего была в отсутствии прав на запуск стратового скрипта smile

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

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

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

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

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

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

Отредактировано alpha_Qu4z4r (15-01-2010 02:25:13)

10

Re: icecast2 + icegenerator на FreeBSD

с помощью sc_trans 2 и cron
в определенное время cron подкидует нужный плейлист, а транскодер после завершения песни играет подкинутый плейлист

11

Re: icecast2 + icegenerator на FreeBSD

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

12

Re: icecast2 + icegenerator на FreeBSD

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

13

Re: icecast2 + icegenerator на FreeBSD

Показать / Cкрыть текст

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

14

Re: icecast2 + icegenerator на FreeBSD

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

15

Re: icecast2 + icegenerator на FreeBSD

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

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

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

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

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

но ничего не происходит (см. скриншот)
http://s61.radikal.ru/i171/1201/9e/021b2c0d697b.jpg

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

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

Отредактировано Disabled (16-01-2012 06:44:18)

16

Re: icecast2 + icegenerator на FreeBSD

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

17

Re: icecast2 + icegenerator на FreeBSD

пишет tarasian666:

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

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

http://s60.radikal.ru/i169/1201/cd/663065b41ded.jpg

18

Re: icecast2 + icegenerator на FreeBSD

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

19

Re: icecast2 + icegenerator на FreeBSD

пишет tarasian666:

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

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

20

Re: icecast2 + icegenerator на FreeBSD

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

21

Re: icecast2 + icegenerator на FreeBSD

пишет tarasian666:

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

Всё осталось на прежнем уровне.
Установил ices0, вроде работает стабильно. 


В любом случае спасибо за помощь.

Отредактировано Disabled (16-01-2012 23:35:08)

22

Re: icecast2 + icegenerator на FreeBSD

А тут еще есть кто-нибудь?:)
Меня вот очень интересует продолжение:) Так и не запускается icegeneranor.Может кто подскажет?
В логе

"Mon May 27 18:01:23 2013: Insufficient parameters to run Icegenerator"

23

Re: icecast2 + icegenerator на FreeBSD

похоже конфиг не полный  Insufficient parameters

24

Re: icecast2 + icegenerator на FreeBSD

Копировал конфиг от сюда

# IceGenerator sample configuration file

#######################################################
# Server section
#######################################################

# IP (REQUIRED)
IP=192.168.16.180

# Port (REQUIRED)
PORT=8000

# Type (REQUIRED)
# 1 - Icecast 1.3.21 or Shoutcast (ICY protocol compatible)
# 2 - Icecast 2.0 (HTTP protocol compatible)
SERVER=2

# Mount point for MP3/OGG streaming. (REQUIRED)
# REMEMBER TO SET A VIRTUAL MOUNT POINT HERE FOR OGG STREAMING. MANY 
# PLAYERS (LIKE WINAMP, XMMS, ETC.) CAN'T AUTO RECOGNIZE OGG STREAMING
# WITHOUT .OGG EXTENSION.
MOUNT=/r.mp3



#######################################################
# User section
#######################################################

# Source user name (usually IceCast is configured for "source"). (REQUIRED)
SOURCE=source

# Server connection password (REQUIRED)
PASSWORD=



#######################################################
# File and playlist section
#######################################################

# Format (REQUIRED)
# 0 - Ogg Vorbis
# 1 - MP3
FORMAT=1

# Path for MP3s/OGGs. (REQUIRED)
# This variable has the following format:
#       playlist_type:playlist_data
# where playlist_type is
#       pth: list of dirs
#       sql: MySQL server table
#       pql: PostGreSQL server table
#       pls: PLS file
#       m3u: M3U file
#
# pth case
#       playlist_data is your mp3's directories separated with full commas
#       eg: pth:/path1;/path2;path3
#
# pql/sql case
#       playlist_data is your PostGreSQL/MySQL connection data (separated with
#       full commas) in the following order:
#       sql:host;port;user;password;database;table;field       where:
#               host is SQL server hostname or IP
#               port is SQL server port. If 0, default port will be used
#               user is SQL user authorized to database read access
#               password is SQL user password
#               database is SQL db name that contains mp3 data
#               table is SQL table of database that contains mp3 data
#               field is SQL table's field that contains mp3 pathname
#
# m3u/pls case
#       you have to specify a M3U/PLS standard playlist file path.
#       eg: pls:/my_path/my_playlist.pls
MP3PATH=pth:/home/user/music

# Set this flag to search recursively from root directories specified (default is disabled)
RECURSIVE=1

# File to record the stream to on the server (default is none)
DUMPFILE=

# Loop playlist (default is enabled)
LOOP=1

# Set this flag to play your music in random order (default is enabled), otherwise
# alphabetic order will be used
SHUFFLE=1

#######################################################
# Information
#######################################################
    
# In next four variables u can put your metadata information that will be
# sent to clients. You can use any string you want.

# Name of the stream (default none).
NAME=Dzzz

# Genre of the stream (default none).
GENRE=djugadjaga

# Description of the stream (default none).
DESCRIPTION=Your

# Url of the stream (default none).
URL=http://192.168.16.180:8000/r.mp3

# Bitrate of the stream. Its value is purely informational. It doesn't
# affect real bitrate of your MP3s (default 24000).
BITRATE=128000

# Flag to list the stream in directories (default 0)
PUBLIC=0

# Set this flag to specify time elapsed between META information update in seconds 
# (default is 5). A value of 0 disables META information, and only NAME value
# will be transmitted.
METAUPDATE=5

# This set global MetaDataFile path for your songs. See README.IceMetal 
# for more info.
#MDFPATH=/home/user/music/global.mdf


#######################################################
# Debug and logging information
#######################################################

# Log 
# 0 - None
# 1 - System logger
# 2 - File
LOG=2

# Log path
# Specify where you want to log IceG actions. Defaults to /var/log/icegenerator.log
# if not specified
LOGPATH=/var/log/icegenerator.log

#######################################################
# Telnet interface
#######################################################

# Now IceGenerator has a minimal telnet interface that
# receives run-time commands to change IceGenerator
# behaviour while streaming. Case is insensitive.
# ALL COMMAND MUST BE FOLLOWED BY A TRAILING DOT!!!
# Telnet commands are:
#      TRACK
#           Returns information about current track
#      LOOP
#           Returns information about current LOOP setting
#      LOOPON
#           Turns on playlist loop
#      LOOPOFF
#           Turns off playlist loop
#      SHUFFLE
#           Returns informations about current SHUFFLE setting
#      SHUFFLEON
#           Turns on shuffle
#      SHUFFLEOFF
#           Turns off shuffle
#
# DATAPORT is used to specify telnet port. If not specified, telnet
# interface will be disabled. If 0, 8796 (default port) will be used.
#DATAPORT=8796

Отредактировано zikfriddi (27-05-2013 17:24:38)

25

Re: icecast2 + icegenerator на FreeBSD

Все нашел, я не написал пароль:)....зато ветку поднял!!! Спасибо автору!