Делаем свое интернет радио.
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?
Нужна ли статья по настройке полностью автономной станциии, управляемой через jabber?
Ну что за вопрос конечно нужна!!!!
Привет, спасибо за статью про интернет радио!
Все смог сделать, но вот с Ices0.4 возникли проблемы. При запуске пишет:
Error during send: Mount failed on http://127.0.0.1:8000/ices, error: Login failed
Хотя пароль\логин 100% правильный. Я так понимаю что он берет данные к подключению из какого то другого конфигурационного файла а не из ices.conf не пойму только из какого.
Пробовал так: ices c- /usr/local/etc/ices.conf
Выдает:
Connot use config file (no XML support).
Ices Exiting…
конфиг покажите
/usr/local/etc/ices.conf
Не получилось вставить. Вот файл: Файл тут: http://narod.ru/disk/60736595001.172d5a72c213c47d27f3bb9cf17e0bf9/config.rar.html
Здравствуйте!
Кто поможет поставить?
У меня никак не получается!
Помочь можем,услуга платная, зависит от того, что Вам нужно
Часть услуг описано тут http://www.pipradio.com/platnye-uslugi
>ibshout-2.2.2
Опечатка, исправьте. Алсо, годная статья спасибо.
спс, исправлено
Добрый вечер! возникли проблемы со статистикой по вашему примеру — графики отображаются но на них ничего нет. Не пойму что не так.
Спасибо
Напишите мне в скайп dj_darkness_lord
Доброго времени суток !
я хотел сделать что бы когда диджей подключался автодиджей замолкал и на оборот я взял настройки mount прямо из конфига icecast.xml и поставил в свой конфиг перезапустил радио и получил ошибку потом я решил взять ваш конф и поставил его и перезапустил радио конечно же я ваш конф поправил под себя и опять ошибка и тут я начал разбираться и вот что я нашел … ( из конфига взял весь кусок mount ) …
/nonstop
utf-8
/intro1.mp3
<=== вот этот волшебный тег на этом месте разве не нужен если нет то тогда зачем ниже стоит закрывающийся тег ?
/live
password
utf-8
/nonstop
1
pipradio.net
9500
/live
/nonstop
0
0
1
в тегах убрал одну из » > или < " а то пропали теги куда то =(
mount>
mount-name>/nonstoputf-8/intro1.mp3</intro
/livepasswordutf-8/nonstop1</fallback-override
</mount
<!— Настройки релая:сервер,моунт сервера,локальный моунт
pipradio.net9500/live/nonstop00</relay-shoutcast-metadata
1</fileserve
сори за флуд хотел сделать что бы было вам понятно брал > вообще во всех тегах
Настройка точки монтирования,кодировка,пароли,джингл и тд
mount
mount-name /nonstop /mount-name
charset utf-8 /charset
intro /intro1.mp3 /intro
/mount
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
эм я вас все же не понял, проверил теги,все вроде верно, простой fallback-mount должен выглядеть приверно так:
ps чтобы в коментах не съедались теги, заключите их в [ xml][ /xml]
Извиняюсь сразу! Но если народ будет как я тупо копипастить то не хватает в тексте одного параметра в строке 58 и тогда icecast 2 точно запустится без проблем!
58 сторкоа пустая =) кофиги все рабочии
Вот такую ошибку мне выдает.
ERROR: Line 43 (LegendO[all]) in CFG file (/etc/mrtg.cfg) does not make sense
Что с этим делать? о_О
мм можно побробнее? какая ОС, кто выдает?
Да, прошу прощения, что сразу не сказал
Ubuntu-12.04-32
Все установлено, все работает кроме mrtg. При попытке запустить командой env LANG=C /usr/bin/mrtg /etc/mrtg.cfg выдает вон ту самую ошибку
так а конфиг mrtg можно? лучше на почту напишите support@pipradio.com