Делаем свое интернет радио.

30.06.2012 от admin 61

Делаем свое интернет радио.

В этой статье я расскажу как сделать свое интернет радио с нонтопом,красивой статистикой, переброской слушателей с пустого канала и правильной кодировкой.

Все манипуляции я буду проделывать на Debian 6.0, но данный how-to подойдет для любого debian-based дистрибутива (ubuntu,linux mint etc).
Что будем ставить:

  • Icecast2
  • Ices0.4(для вещания mp3, для OGG нужно ставить Ices2)
  • MRTG (для построения графиков)
  • Библиотеки(libshout-2.2.2,libmp3lame-3.97, LibXML2)

Установка библиотек.


Ubuntu.

В Ubuntu server 9.04 и выше все библиотеки есть в репозиториях, поэтому ставим:


apt-get install libshout-dev
apt-get install libmp3lame-dev
apt-get install libxml2-dev

Debian.

В Debian 6.0 так же есть в репозитории, только его нужно добавить:

nano /etc/sources.list

И вниз списка добавляем:

deb http://www.deb-multimedia.org squeeze main non-free

Сохраняем результат(control + X y) и устанавливаем ключ репозитория:

cd /tmp
 wget http://www.deb-multimedia.org/pool/main/d/debian-multimedia-keyring/debian-multimedia-keyring_2010.12.26_all.deb
 dpkg -i debian-multimedia-keyring_2008.10.16_all.deb

После чего обновляем список пакетов:


apt-get update
apt-get upgrade

И устанавливаем наши библиотеки:

 apt-get install libshout-dev libmp3lame-dev libxml2-dev 

IceCast 2.

Установка icecast2.

К счатью, Icecast server есть в репозиториях, поэтому ставим его командой:

 apt-get install icecast2 

При этом, во время установки, Icecast создаст пользователя и группу Icecast.

Настройка Icecast.

Открываем для редактирования конфиг Icecast2:

 nano /etc/icecast2/icecast.xml 

И видим наш конфиг(ниже приведу его полностью с пометками):

<icecast>

<limits>

<clients>1500</clients>

<sources>22</sources>

<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'(диджей) -->

<source-password>passowrd</source-password>

<!-- Пороль пользователя 'relay' -->

<relay-password>password</relay-password>

<!-- Имя и пароль Админа -->

<admin-user>admin</admin-user>

<admin-password>password</admin-password>

</authentication>
<!-- Хост,порт нашего сервера -->
<hostname>pipradio.net</hostname>

<listen-socket>

<port>9500</port>

</listen-socket>
<!-- Настройка точки монтирования,кодировка,пароли,джингл и тд -->
<mount>

<mount-name>/nonstop</mount-name>

<charset>utf-8</charset>

<intro>/intro1.mp3</intro>

</mount>

<mount-name>/live</mount-name>

<password>password</password>

<charset>utf-8</charset>

<fallback-mount>/nonstop</fallback-mount>

<fallback-override>1</fallback-override>

</mount>
<!-- Настройки релая:сервер,моунт сервера,локальный моунт -->
<relay>

<server>pipradio.net</server>

<port>9500</port>

<mount>/live</mount>

<local-mount>/nonstop</local-mount>

<on-demand>0</on-demand>

<relay-shoutcast-metadata>0</relay-shoutcast-metadata>

</relay>

<fileserve>1</fileserve>

<paths>

<!-- basedir is only used if chroot is enabled -->

<basedir>/usr/share/icecast2</basedir>

<!-- Note that if <chroot> is turned on below, these paths must both

be relative to the new root, not the original root -->

<logdir>/var/log/icecast2</logdir>

<webroot>/usr/share/icecast2/web</webroot>

<adminroot>/usr/share/icecast2/admin</adminroot>

<!-- <pidfile>/usr/share/icecast2/icecast.pid</pidfile> -->

<!-- Aliases: treat requests for 'source' path as being for 'dest' path

May be made specific to a port or bound address using the "port"

and "bind-address" attributes.

-->

<!--

<alias source="/foo" dest="/bar"/>

-->

<!-- Aliases: can also be used for simple redirections as well,

this example will redirect all requests for http://server</a>:port/ to

the status page

-->

<alias source="/" dest="/status.xsl"/>

</paths>

<logging>

<accesslog>access.log</accesslog>

<errorlog>error.log</errorlog>

<!-- <playlistlog>playlist.log</playlistlog> -->

<loglevel>3</loglevel>
 <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->

<logsize>10000</logsize>
 <!-- Max size of a logfile -->

<!-- If logarchive is enabled (1), then when logsize is reached

the logfile will be moved to &#91;error|access|playlist&#93;.log.DATESTAMP,

otherwise it will be moved to &#91;error|access|playlist&#93;.log.old.

Default is non-archive mode (i.e. overwrite)

-->

<!-- <logarchive>1</logarchive> -->

</logging>

<security>

<chroot>0</chroot>

<!--

<changeowner>

<user>nobody</user>

<group>nogroup</group>

</changeowner>

-->

</security>

</icecast>

Из всего конфига, нам интересны только несколько секций, это лимиты, пароли и тонкая настройка маунтов(точек монтирования). С первыми двумя секциями, обычно, вопросов не возникает, а вот с настройках маунтов мы сейчас поговорим подробнее.

Настройка fallback mount.(резервная точка монтирования)

Для начала объясню что такое fallback точка монтирования на простом примере. Предположим у вас есть две точки монтирования: /live и /nonstop , на /live у вас соответственно время от времени ведут диджеи, а на /nonstop постоянно играет музыка. Без fallback все слушатели которые были на точке /live , при отключении диджея сбрасываютcz, и если захотят послушать /nonstop им нужно переподключиться самим. С помощью fallback мы сделаем это автоматически, добавляем в конфиг следующие строки:


<mount>

<mount-name>/live</mount-name>

<fallback-mount>/nonstop</fallback-mount>

<fallback-override>1</fallback-override>

</mount>

Где /live это исходная точка (та с которой перекидываем) , а /nonstop точка назначения. На этом вся настройка fallback-mount закончена. Теперь пришло время для кодировки.

Настройка кодировки IceCast.

Очень часто бывает, что воспроизводимая песня отображается не правильно, или не отображается совсем, как на картинке ниже:

Что бы исправить это досадную оплошность, можно принудительно выставить кодировку для точки монтирования, например для /live это будет выглядить так :


<mount>

<mount-name>/live</mount-name>

<fallback-mount>/nonstop</fallback-mount>

<charset>utf-8</charset>

<fallback-override>1</fallback-override>

</mount>

Где utf-8кодировка тегов нашей музыки.(обычно или cp1251 или unf-8)
Так же в разделе mount можно установить другой пароль на определенную точку,название канала,музыки,радио :


<mount>

<mount-name>/live</mount-name>

<password>password</password>

<stream-name>PiPRadio Live</stream-name>

<genre>Live</genre>

<stream-description>Live channel</stream-description>

<fallback-mount>/nonstop</fallback-mount>

<charset>utf-8</charset>

<fallback-override>1</fallback-override>

</mount>

Ices0.4.

Ices0.4 будет выполнять у нас функцию нонстопа эфира. К сожалению, ices нет в репозиториях, поэтому нам придется его собрать.

Установка Ice0.4.

Для сборки ices выполняем команды:

cd /tmp
 wget http://downloads.us.xiph.org/releases/ices/ices-0.4.tar.gz
 tar -zxvf ices-0.4.tar.gz
 cd ices-0.4
 ./configure
 make
 make install

После того как мы собрали наш ices, будем его настраивать.

Настройка Ices0.4

Опять же переходим к конфигу ices, пример которого должен быть в /usr/local/etc/ices.conf.dist , копируем его :

 cp /usr/local/etc/ices.conf.dist /usr/local/etc/ices.conf 

И открываем для редактирования:

 nano /usr/local/etc/ices.conf 

Опять же приведу конфиг целиком с пометками с важных местах:

<?xml version=»1.0″?>

<ices:Configuration xmlns:ices=»<a href="http://www.icecast.org/projects/ices">http://www.icecast.org/projects/ices</a>»>

<Playlist>

<!—  Путь до плей листа(текстовый документ)

—>

<File>/mnt/pipradio.net/playlist.txt</File>

<!— Настройка перемешивания треков, 1 — перемешивать 0 — играть по порядк —>

<Randomize>1</Randomize>

<!—Тип листа: builtin, perl, or python. —>

<Type>builtin</Type>

<!— Module name to pass to the playlist handler if using perl or python.

If you use the builtin playlist handler then this is ignored —>

<Module>ices</Module>

<!— Set this to the number of seconds to crossfade between tracks.

Leave out or set to zero to disable crossfading (the default).

<Crossfade>5</Crossfade>

—>

</Playlist>

<Execution>

<!— Set this to 1 if you want ices to launch in the background as a

daemon —>

<Background>0</Background>

<!— Set this to 1 if you want to see more verbose output from ices —>

<Verbose>0</Verbose>

<!— This directory specifies where ices should put the logfile, cue file

and pid file (if daemonizing). Don’t use /tmp if you have l33t h4x0rz

on your server. —>

<BaseDirectory>/tmp</BaseDirectory>

</Execution>

<!—Настройка подключения в серверу —>

<Stream>

<Server>

<!— Hostname or ip of the icecast server you want to connect to —>

<Hostname>pipradio.net</Hostname>

<!— Port of the same —>

<Port>9500</Port>

<!— Encoder password on the icecast server —>

<Password>Ваш пароль</Password>

<!— Header protocol to use when communicating with the server.

Shoutcast servers need «icy», icecast 1.x needs «xaudiocast», and

icecast 2.x needs «http». —>

<Protocol>http</Protocol>

</Server>

<!— Настройки точки монтирования(канала) —>

<Mountpoint>/live</Mountpoint>

<!— The name of the dumpfile on the server for your stream. DO NOT set

this unless you know what you’re doing.

<Dumpfile>ices.dump</Dumpfile>

—>

<!— The name of you stream, not the name of the song! —>

<Name>Live</Name>

<!— Genre of your stream, be it rock or pop or whatever —>

<Genre>Default genre</Genre>

<!— Longer description of your stream —>

<Description>Default description</Description>

<!— URL to a page describing your stream —>

<URL><a href="http://pipradio.net">http://pipradio.net</a></URL>

<!— 0 if you don’t want the icecast server to publish your stream on

the yp server, 1 if you do —>

<Public>1</Public>

<!—  Настройка битрейта потока —>

<Bitrate>128</Bitrate>

<!— If this is set to 1, and ices is compiled with liblame support,

ices will reencode the stream on the fly to the stream bitrate. —>

<Reencode>0</Reencode>

<!— Number of channels to reencode to, 1 for mono or 2 for stereo —>

<!— Sampe rate to reencode to in Hz. Leave out for LAME’s best choice

<Samplerate>44100</Samplerate>

—>

<Channels>2</Channels>

</Stream>

</ices:Configuration>

На этом настройка ices почти закончилось, перейдем к плэй листам.

Создание плей листов Ices0.4

Для создания плэй листа можно использовать два метода, сложный ручной и автоматический. Мы выбираем естественно автоматический. Но для начала не много поясню что и где.

Предположим что музыка у вас лежит в папке /mnt/music/nonstop, переходим в папку и создаем наш плэйлист:

 cd /mnt/music/nonstop
 ls > playlist.txt

После выполнения команды, у нас появится файл playlist.txt, в котором будет список всего содержимого папки /mnt/music/nonstop.

Запуск.

Icecast2.

Для запуска Icecast2, сначала надо разрешить ему запуск , для этого открываем:

 nano /etc/default/icecast2 

И правим параметр # Change this to true when done to enable the init.d script
ENABLE=true , должно получиться вот так:

# Defaults for icecast2 initscript
# sourced by /etc/init.d/icecast2
# installed at /etc/default/icecast2 by the maintainer scripts

#
# This is a POSIX shell fragment
#

# Full path to the server configuration file
 CONFIGFILE=»/etc/icecast2/icecast.xml»

# Name or ID of the user and group the daemon should run under
 USERID=icecast2
 GROUPID=icecast

# Edit /etc/icecast2/icecast.xml and change at least the passwords.
# Change this to true when done to enable the init.d script
 ENABLE=true
 

И запускаем icecast командой:

 service icecast2 start 

Для проверки запущен-ли сервер можно перейти по адресу, который Вы указали при настройке вашего сервера, например http://pipradio.net:9500 , где должен открыться веб интерфейс icecast.

Ices0.4

Если ices будет у Вас вещать только один канал, то его можно запустить командой:

 ices 

Но если у Вас несколько каналов, и соответственно несколько конфигов, то запускается ices командой:

 ices -c /usr/local/etc/ices.conf 

Где /usr/local/etc/ices.conf пусть до вашего конфига.

На этом настройка завершена. Переходим к статистике.

Статистика.

Практически с самого первого запуска сервера радио, я ломал голову, как сделать учет и подсчет статистики слушателей. На помощь пришел MRTG, программа, первоначально созданная для подсчета трафика и чтения логов.

Установка MRTG.
Установить MRTG в debian и ubuntu можно командой :

 apt-get install mrtg 

На этом собственна и вся установка, так что переходим к настройке.
Настрока MRTG
После установки файл конфигурации MRTG должен находит в /etc/mrtg.cfg, отредактируем его:

 nano /etc/mrtg.cfg 

ВАЖНО!
Если собираетесь использовать MRTG только для снятия статистики IceCast2, то можете смело удалять все содиржимое конфига, и вставить следующие строки:

 Interval: 5
 RunAsDaemon: yes
 Refresh: 300
 Language: russian
 WorkDir: /var/www/pipradio.net/web/statistica
 WriteExpires: Yes
 WithPeak[_]: dwmy
 XSize[_]: 600
 YSize[_]: 200
 Title[^]: Graphs: 

Тут не много объясню, что к чему.

 Interval: 5 

Время обновления графиков в минутах.

 RunAsDaemon: yes 

Стартовать MRTG как демон.

 WorkDir: /var/www/pipradio.net/web/statistica 

Папка куда будут складываться файлы.(можно создать например поддомен ice.pipradio.com)

 XSize[_]: 600
 YSize[_]: 200

Размер графиков.
Теперь создаем скрипт, который будет собирать статистику радио со всех потоков:

 nano /etc/allstat.php 

И втсавляем следующие:

#!/usr/bin/php
 < ?php
 $file_name='http://pipradio.net:9500/status2.xsl';
 $r=fopen($file_name,'r');
 $text=fread($r,1000);
 fclose($r);
 $mass=explode(",", $text);
 $list=$mass &#91;9&#93;;
 $mas=explode (" ", $mass &#91;7&#93;);
 $ti=substr($mas &#91;0&#93;,7);
 $day=floor($ti/86500);
 $he=floor(($ti-$day*86500)/3600);
 $mi=floor(($ti-$day*86500-$he*3600)/60);
 $upt="".$day." days, ".$he." hours, ".$mi." minutes.";
 $s=0;
 echo $list."n";
 echo $s."n";
 echo $upt."n";
 echo "/all"; ?>

Если же вы хотите снимать статистику с какого-то одного потока, то скрипт будет выглядить так:

#!/usr/bin/php
 < ?php
 $file_name='http://pipradio.net:9500/status2.xsl?mount=/nonstop;
 $r=fopen($file_name,'r');
 $text=fread($r,1000);
 fclose($r);
 $mass=explode(",", $text);
 $list=$mass &#91;14&#93;;
 $mas=explode (" ", $mass &#91;7&#93;);
 $ti=substr($mas &#91;0&#93;,7);
 $day=floor($ti/86500);
 $he=floor(($ti-$day*86500)/3600);
 $mi=floor(($ti-$day*86500-$he*3600)/60);
 $upt="".$day." days, ".$he." hours, ".$mi." minutes.";
 $s=0;
 echo $list."n";
 echo $s."n";
 echo $upt."n";
 echo "/all"; ?>

Где ?mount=/nonstop’; название потока(точки монтирования icecast)
Теперь даем права на выполнение скрипта:

 chmod 755 /etc/allstat.php 

И добавляем наш скрипт в конфиг MRTG:

 nano /etc/mrtg.cfg 

Вниз вставляем:

 Target[all]: `/etc/allstat.php`
 Options[all]: nopercent, integer, gauge
 MaxBytes[all]: 1000
 AbsMax[all]: 1000
 Title[all]: Listens
 PageTop[all]:All Listens
 YLegend[all]: # of connections
 ShortLegend[all]: L/s
 Legend1[all]: # of listeners
 Legend2[all]:
 Legend3[all]: Maximal # of listeners
 Legend4[all]:
 LegendI[all]:  # of listeners:
 LegendO[all]

ВАЖНО!
Если хотите видеть статистику по потокам, обратите внимание на [all] это индификатор графика, он должен быть разным для каждого потока
Попробуем запустить MRTG

 env LANG=C /usr/bin/mrtg /etc/mrtg.cfg 

Если ошибок вида Target[all][_IN_] ‘ $target->[1]{$mode}
нет ,значит все хорошо, если есть, проверьте ваш сервер, и в случаи снятия статистики с отдельного потока, проверьте есть ли он.
Теперь нам нужно создать файл index.html, для этого используем команду:

 indexmaker mrtg.cfg > /var/www/pipradio.net/web/statistica/index.html 

После чего заходим смотреть нашу статистику по адресу pipradio.net/statistica
На этом настройка завершена, графики должны заработать.
В примере указан сайт pipradio.net , у вас должен быть другой путь и другая рабочая папка.
Если возникли вопросы пишите в комментариях.

Нужна ли статья по настройке полностью автономной станциии, управляемой через jabber?