Трансляция интернет-радио и локальной музыкальной коллекции с помощью icecast2 и mpd в Debian 4.0 Etch

В первую очередь разберемся что же из себя представляют вышеназванные программы
- icecast2 (http://www.icecast.org/) - потоковый медиа-сервер, поддерживающий Ogg Vorbis и MP3 аудио потоки. Icecast - проект с открытым исходным текстом и распространяющийся на условиях лицензии GPLv2

- mpd (http://www.MusicPD.org) - предоставляет удаленный доступ для воспроизведения музыки (MP3, Ogg Vorbis, FLAC, AAC, Mod, и wave форматов) управлением плей-листа и пр. MPD также является проектом с открытым исходным текстом и распространяющимся на условиях лицензии GPLv2

1. Установка и настройка mpd.
apt-get install mpd
vi /etc/mpd.conf
# MPD CONFIG FILE
# For a full description of all config parameters,
# Check the mpd man page, "man mpd".

############ REQUIRED####################

# You can put symlinks in here, if you like. Make sure
# user that mpd runs as (see the 'user' config parameter)
# can read the files in this directory

# You can put symlinks in here, if you like. Make sure
# user that mpd runs as (see the 'user' config parameter)
# can read the files in this directory
music_directory "/mnt/musik"
playlist_directory "/mnt/musik"
db_file "/var/lib/mpd/tag_cache"
log_file "/var/log/mpd/mpd.log"
error_file "/var/log/mpd/errors.log"
pid_file "/var/run/mpd/pid"
###########################################

###########################################
# EVERYTHING ELSE IS OPTIONAL
###########################################

############# AUDIO OUTPUT####################
#Я не использую ни OSS ни ALSA
audio_output {
type "ao"
driver "null"
name "default ao output"
}

############## SHOUT STREAMING################
audio_output {
type "shout"
name "new stream"
host "127.0.0.1"
port "8001"
mount "/mpd.ogg"
password "password_mpd"
bitrate "128"
format "44100:16:1"
} # end of audio_output
################ FILESYSTEM SETTINGS ############
filesystem_charset "UTF-8"
id3v1_encoding "CP1251"
###########################################
state_file "/var/lib/mpd/state"
########## SECURITY SETTINGS####################
user "mpd"
bind_to_address "localhost"

Немного о приведенных параметрах конфигурации-

music_directory "/mnt/musik"
playlist_directory "/mnt/musik"
db_file "/var/lib/mpd/tag_cache"
log_file "/var/log/mpd/mpd.log"
error_file "/var/log/mpd/errors.log"
pid_file "/var/run/mpd/pid"

В данном разделе указываем пути к нашей музыкальной коллекции, плей-листу, базе, файлам логирования.

audio_output {
type "ao"
driver "null"
name "default ao output"
}

как уже было сказано выше - я не использую ни OSS, ни ALSA, поэтому в качестве устройства вывода использую "null"
Для использования OSS либо ALSA пишем:
для OSS -

audio_output {
type "oss"
name "my OSS sound card"
device "/dev/dsp" # optional
format "44100:16:2" #optional
}
# OSS Mixer
mixer_type "oss"
mixer_device "/dev/mixer"
mixer_control "PCM"

для ALSA

audio_output {
type "alsa"
name "my ALSA device"
device "hw:0,0" # optional
format "44100:16:2" #optional
}
# ALSA Mixer
mixer_type "alsa"
mixer_device "default"
mixer_control "PCM"

Для передачи потока к icecast2 -

audio_output {
type "shout"
name "my stream"
host "127.0.0.1"
port "8001"
mount "/mpd.ogg"
password "password_mpd"
bitrate "128"
format "44100:16:1"
} # end of audio_output

В данном разделе указываем параметры соединения для icecast2 (type, host, port, mount, password) и качество потока (bitrate, format)

filesystem_charset "UTF-8"
id3v1_encoding "CP1251"

UTF8 - кодировка файловой системы
id3v1_encoding - кодировка тегов музыкальных композиций

Я опустил большинство параметров и привел минимальную рабочую конфигурацию (статья будет в формате шпаргалки)
Стартуем mpd:
исправляем в /etc/default/mpd
START_MPD=true
и /etc/init.d/mpd start
создаем базу
mpd --create-db
для управления mpd устанавливаем mpc
apt-get install mpc
добавляем композиции в плей-лист
mpc ls |mpc add
проверяем
mpc playlist
и запускаем
mpc play
проверяем
mpc
К параметрам mpc я еще вернусь, а пока рекомендую man mpc
Мы должны увидеть следующее, разумеется название композиции ваше :)
Др. - Воля что неволя..
[playing] #115/429 1:55 (97%)
volume:100% repeat: on random: on
На этом этап настройки mpd можно считать завершенным

Установка и настройка icecast2
apt-get install icecast2
vi /etc/icecast2/icecast.xml

<icecast>
<limits>
<clients>50</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>password_mpd</source-password>
<relay-password>password_mpd</relay-password>

<admin-user>admin</admin-user>
<admin-password>password_admin</admin-password>
</authentication>

<directory>
<yp-url-timeout>15</yp-url-timeout>
<yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url&gt;
</directory>

<hostname>localhost</hostname>
<!--<port>8000</port> -->
<!--<bind-address>127.0.0.1</bind-address>-->

<listen-socket>
<port>8000</port>
</listen-socket>

<listen-socket>
<port>8001</port>
<bind-address>127.0.0.1</bind-address>
</listen-socket>

<relay>
<server>209.51.161.54</server>
<port>8072</port>
<mount>/</mount>
<local-mount>/radio_rock.mp3</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>81.88.113.18</server>
<port>1072</port>
<mount>/</mount>
<local-mount>/radio_pop.mp3</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>scfire-nyk-aa03.stream.aol.com</server>
<port>80</port>
<mount>/stream/1010</mount>
<local-mount>/jazz.mp3</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>205.188.215.226</server>
<port>8020</port>
<mount>/</mount>
<local-mount>/guitar.mp3</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>72.51.33.149</server>
<port>8000</port>
<mount>/</mount>
<local-mount>/skyrock.mp3</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>www.hitroe.com</server&gt;
<port>8000</port>
<mount>/relay_low.ogg</mount>
<local-mount>/hitroe.ogg</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>85.21.79.5</server>
<port>8073</port>
<mount>/</mount>
<local-mount>/Corbina_rock.mp3</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<fileserve>1</fileserve>

<shoutcast-mount>/stream</shoutcast-mount>

<paths>
<basedir>/usr/share/icecast2</basedir>
<logdir>/var/log/icecast2</logdir>
<webroot>/usr/share/icecast2/web</webroot>
<adminroot>/usr/share/icecast2/admin</adminroot>
<!-- <pidfile>/usr/share/icecast2/icecast.pid</pidfile> -->
<alias source="/" dest="/status.xsl"/>
</paths>

<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<!-- <playlistlog>playlist.log</playlistlog> -->
<loglevel>4</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
<logsize>10000</logsize> <!-- Max size of a logfile -->
</logging>

<security>
<chroot>0</chroot>
<!--
<changeowner>
<user>nobody</user>
<group>nogroup</group>
</changeowner>
-->
</security>
</icecast>

Попытаюсь кратко описать конфигурацию:

<limits>
<clients>50</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>

В данном разделе определяется:
- максимальное количество открытых потоков
<clients>50</clients>;
- количество источников потоков
<sources>2</sources>;
- количество нитей, одновременно обрабатывающие подключения, для загруженных серверов рекомендуется увеличить это значение
<threadpool>5</threadpool>;
- размер очереди (в байтах), ведется для каждого клиента, при большой загрузке сети, клиент может временно отставать, однако при превышении этого параметра клиент удаляется из потока.
<queue-size>524288</queue-size>;
- cледующий параметр в настоящее время не используется
<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>;

Следующий раздел - раздел аутентификации

<authentication>
<source-password>password_mpd</source-password>
<relay-password>password_mpd</relay-password>

<admin-user>admin</admin-user>
<admin-password>password_admin</admin-password>
</authentication>

- пароль для источника потока, указывается в незашифрованном виде
<source-password>password_mpd</source-password>
- пароль для подчиненных серверов, транслирующие ваши потоки.
<relay-password>password_mpd</relay-password>
- логин и пароль для доступа к интерфейсу администратора
<admin-user>admin</admin-user>
<admin-password>password_admin</admin-password>

Если собираетесь публиковать информацию о аудио-потоках вашего сервера в icecast2 YP каталогах, то следующий раздел вам в этом поможет

<directory>
<yp-url-timeout>15</yp-url-timeout>
<yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url&gt;
</directory>

- Время (в секундах) ожидания ответа от сервера icecast2 YP
<yp-url-timeout>15</yp-url-timeout>
- адрес сервера каталога
<yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url&gt;

Настройки интерфейсов сервера

<hostname>localhost</hostname>
<!--<port>8000</port> -->
<!--<bind-address>127.0.0.1</bind-address>-->
<listen-socket>
<port>8000</port>
</listen-socket>
<listen-socket>
<port>8001</port>
<bind-address>127.0.0.1</bind-address>
</listen-socket>

В данном разделе указываются интерфейсы, и порты для связи с нашим сервером
указываем имя сервера -
<hostname>localhost</hostname>
порт к которому будут подключаться клиенты -
<!--<port>8000</port> -->
если необходимо сделать привязку к конкретному интерфейсу, указываем -
<!--<bind-address>127.0.0.1</bind-address>-->
Следующим этапом определяю сокеты для основного и альтернативного (mpd) потоков

<listen-socket>
<port>8000</port>
</listen-socket>

в данном случае отсутствует директива bind-address, поэтому 8000 порт будет доступен на всех сетевых интерфейсах.

<listen-socket>
<port>8001</port>
<bind-address>127.0.0.1</bind-address>
</listen-socket>

для подключения mpd мы используем порт 8001 и слушать его будем исключительно на внутреннем интерфейсе.

Следующим разделом мы будем ретранслировать внешний аудио-поток через наш сервер

<relay>
<server>209.51.161.54</server>
<port>8072</port>
<mount>/</mount>
<local-mount>/radio_rock.mp3</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

Адрес удаленного источника -
<server>209.51.161.54</server>
Порт удаленного источника -
<port>8072</port>
точка монтирования удаленного потока -
<mount>/</mount>
локальная точка монтирования -
<local-mount>/radio_rock.mp3</local-mount>
Поток будет транслироваться только в том случае, если к нему подключен клиент (1-включено, 0-выключено) -
<on-demand>1</on-demand>
Трансляция метаданных потока (названия песен)
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
Аналогично поступаем для всех серверов

В данном разделе определяем пути используемые icecast2

<paths>
<basedir>/usr/share/icecast2</basedir>
<logdir>/var/log/icecast2</logdir>
<webroot>/usr/share/icecast2/web</webroot>
<adminroot>/usr/share/icecast2/admin</adminroot>
<!-- <pidfile>/usr/share/icecast2/icecast.pid</pidfile> -->
<alias source="/" dest="/status.xsl"/>
</paths>

Используется только в том слчае, если icecast2 запущен в chroot окружении -
<basedir>/usr/share/icecast2</basedir>
Путь к файлам журнала -
<logdir>/var/log/icecast2</logdir>
Путь к базовому каталогу, используемого для запросов -
<webroot>/usr/share/icecast2/web</webroot>

Раздел журналирования

<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<!-- <playlistlog>playlist.log</playlistlog> -->
<loglevel>4</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
<logsize>10000</logsize> <!-- Max size of a logfile -->
</logging>

В данный файл будет помещаться информация о запросах к нашему серверу -
<accesslog>access.log</accesslog>
В файл error.log помещается отладочная информация
<errorlog>error.log</errorlog>
Уровень логирования, для начала рекомендуется 4 - отладочный, после того как сервер будет введен в эксплуатацию, желательно использовать - 1-й уровень -
<loglevel>4</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
Следующий параметр определяет максимальный размер (в килобайтах) журнальных файлов
<logsize>10000</logsize> <!-- Max size of a logfile -->

И последний раздел - раздел безопасности

<security>
<chroot>0</chroot>
<!--
<changeowner>
<user>nobody</user>
<group>nogroup</group>
</changeowner>
-->
</security>

В нем определяем будем ли стартовать icecast2 в chroot окружении, (0 - не используется, 1 - включено) -
<chroot>0</chroot>
Пользователь и группа от имени которого будет запускаться icecast2 -
<user>nobody</user>
<group>nogroup</group>
Последним этапом настройки будет редактирование /etc/default/icecast2 - исправляем false на true
ENABLE=true
И стартуем /etc/init.d/icecast2 start
Для того, что бы проверить работоспособность набираем в вашем любимом браузере http://ip_adress_server:8000 . Мы должны увидеть следующую картину

Если, что-то пошло не так смотрим /var/log/icecast2/error.log
Т.к. у меня при перезагрузке icecast2 не всегда успевал отработать "stop" в /etc/init.d/icecast2 исправление sleep 1 на sleep 5 исправило ситуацию
P.S. Хочу заметить, что это черновой вариант. Принимаю любую критику.
2008 Владислав Никитин

Теги