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

Изображение пользователя vlad.

В первую очередь разберемся что же из себя представляют вышеназванные программы
- 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>
    </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>
            <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>
</directory>

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

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

 <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 Владислав Никитин

Комментарии

Ок. Я понял. Спасибо. :)

Ок. Я понял. Спасибо. :) Просто тяжко сходу понять что откуда.

А как заставить mpd выдавать mp3 поток? Мне нужно для флеш-плеера, который только mp3 поддерживает... (:

Я вот никак не пойму - в

Я вот никак не пойму - в каком месте связывается локальный mpd с сервером.
Мне надо так, чтобы музыка играла в mpd - и ее можно было взять из потока извне.
Т.е. сделать радио...
И ничего не получается.
Максимум чего удалось добится - это выдача "чего-то", что называется "Мультимедия Ogg" и пытается скачаться, а не запускается в плеере потоком.

Как из играющего локально mpd сделать поток во внешний мир? :)

ЗЫЖ Др. - крут. ;)

Изображение пользователя vlad.

Я пытался описать именно

Я пытался описать именно такую связку, возможно не очень хорошо, т.ч. на любую критику постараюсь адекватно отреагировать.
"Мультимедия Ogg" - это и есть тот самый поток

Спасибо

Спасибо настроил работает уже неделю вещаю только без mpd а посто через комп и icecast2
у меня вопрос а как зделать чтоб для каждого диджея был свой пароль и закреплённый за ним Mount?????
а то у меня уже три диджея транслируют и все через админский пароль.
Для них ничего не прописовал просто кто подключаеться тот и есть в списке вещаний.