Делаем свое интернет радио.
30.06.2012Делаем свое интернет радио.
В этой статье я расскажу как сделать свое интернет радио с нонтопом,красивой статистикой, переброской слушателей с пустого канала и правильной кодировкой.
Все манипуляции я буду проделывать на 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 [error|access|playlist].log.DATESTAMP, otherwise it will be moved to [error|access|playlist].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 [9]; $mas=explode (" ", $mass [7]); $ti=substr($mas [0],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 [14]; $mas=explode (" ", $mass [7]); $ti=substr($mas [0],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?
все сделал как написано, но графики почему то не обновляются.
icecast последней версии стоит. Ices0.4 не ставил т.к. не нужна эта программа мне.
Заметил на странице такую строку «в это время ‘$text=fread($r,1000);’ была включена $r=fopen($file_name,’r’);». может ошибка какая нить?
Уже гору статей перекопал, но нигде никто не спросил и видимо никому не нужен init.d скрипт старта ices после icecast2 при перезагрузке сервера.
Уважаемые!
Есть у кого-нибудь init.d скрипт для запуска ices под debian?
Просто в крон добавте задание при загрузке например
Как-то так можно попробовать, не тестил https://gist.github.com/YokiToki/01ed1b2738ae473044f4a45e79ca9dfb
и типо того что-то
sudo mv /etc/init.d/ices
sudo chmod 755 /etc/init.d/ices
cd /etc/init.d
sudo update-rc.d ices defaults 97 03
можно и так, однако, я в скрипт добавил бы еще обновление плэйлиста
Спасибо! Все сделал по инструкции, но не пойму, как подцепиться с удаленного сервера во время воспроизведения плейлиста!? не пускает(
Не могли бы перефразировать вопрос ? я что-то не понял чего вы хотите добиться