Делаем свое интернет радио.
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?
Когда стартую сервис, то выдаёт:
root@hs1:/tmp/ices-0.4# /etc/init.d/icecast2 start
Starting icecast2: Starting icecast2
Detaching from the console
icecast2.
root@hs1:/tmp/ices-0.4#
Понять только не могу, что ему надо (debian 6) Конфиги пока не правил
ничего ему не надо, он запустился
Может он и запустился, но в адресе мой_ip:8000 ничего не открывает 🙁
Конфиг стандартный был или взяли из статьи?
Стандартный, поменял только вместо localhost свой ip и всё. рестарт и ничего.
верните localhost, в терминале вбейте команду netstat -tunap | grep icecast2 должно быть что-то вроде:
tcp 0 0 0.0.0.0:9500 0.0.0.0:* LISTEN 3193/icecast2
tcp 4096 0 127.0.0.1:9500 127.0.0.1:33287 ESTABLISHED 3193/icecast2
Сделал:
root@hs1:~# netstat -tunap | grep icecast2
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 6465/icecast2
ну вот он запущен и работает на порте 8000 , предполагаю что тут два варианта: 1 у вас в фаерволе закрыт порт 8000 2 ip адрес сервера не верен
адрес точно верный + есть ещё домен привязанный к нему, собственно пробовал и так и так. А вот насчёт порта трудно сказать, а как проверить не знаю.
А большое значение имеет, если я от рута всё делая и сервис запускаю?
тут без разници , проверить порт можно так nmap -sT -O localhost , выведет список портов :
8085/tcp open unknown
9500/tcp open ismserver
всё разобралс, всё запутилось. Сам виноват забыл. Короче используется ISPconfig3 в нём есть файрвол, вообщем там нужно вписать порт на который будет вешаться icecast2. В любом случае спасибо за наводку 🙂
да незачто=) удачи
Здравствуйте.
Я не понял, как именно на определенной страничке добавить изменения, чтобы на ней появился звук с моей «радиостанции»? «Радиостанцию» еще не ставил. Планируется только один музыкальный канал без микрофона, где будет крутиться только один плей-лист.
обычно плеер ставят, например uppod
А кто знает, какой плеер можно воспроизвести на айпадах и йафонах, ведь они флеш то не понимают?
Уважаемый админ, прошу помочь настроить мне icecast2 сервер на моем VPS сервере! плачу деньги! )
Домен debian-multimedia.org теперь в других руках, у Debian домен репозитория мультимедиа стал deb-multimedia.org, учтите это при обновлении репозиториев.
спасибо за информацию. поправлю
сделал все как у вас но возникают проблемы почему то идет в разной частоте музыка, 2 с тегами полный атас и 3 часто переподключается плеер
что значит в разной частоте и часто переключается плеер?
что в какой частоте файл идет и в такой играет радио. а в плеере идет частое обновление слишком частое
под плеером я имею ввиду которые аимп3 и винамп и тот что на сайте на высоцком барахлит
Здравствуйте. Организовал поток, но мне нужно организовать второй поток. Прошу помочь с этим, т.к не знаю то ли нужно играть с точками монтирования, то ли другой порт выделять. Вещание будет вестись с плейлиста.
вторым потоком к другой точке
Не совсем представляю как в конфигах это организовать.
В ices.conf есть контейнер:
/name1
В icecast.xml есть теги:
/name1
/name2
Как вещать в name2? В ices.conf прописать еще один теги /name2 ?
Или в icecast.xml добавить теги /name2 ?
вторую копию ices запусти с конфигом на другую точку
Коим образом?
Здравствуйте, подскажите в чем может быть проблема.
При запуске ices в консоли вот такая штука:
Logfile opened
Playing /mnt/m-n-l.ru/Ne_Budite_Spyacshih-Alkogoliki_instrumental(vmusice.net).mp3
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Error during send: Mount failed on http://m-n-l.ru:9500/live, error: Login failed
Too many stream errors, giving up
Ices Exiting…
Я понимаю, что проблема с аутентификацией, но пароли прописаны верные…
Ответ в самой ошибке, проверьте логин пароль на подключение к серверу и название маунта, возможно маунт уже занят
Здравствуйте, уважаемый!
Сделал все по писанному, только не выходит каменный цветок..
от что в логах творицца:
[2015-10-23 18:48:33] INFO main/main Icecast 2.3.3 server started
[2015-10-23 18:48:33] INFO connection/get_ssl_certificate No SSL capability
[2015-10-23 18:48:33] INFO yp/yp_update_thread YP update thread started
[2015-10-23 18:48:33] INFO stats/_stats_thread stats thread started
[2015-10-23 18:48:33] WARN source/source_fallback_file unable to open file «/usr/share/icecast2/web/nonstop»
что за «/usr/share/icecast2/web/nonstop»? нету такого в директории «/usr/share/icecast2/web»
куда копать??
отбой! файерволл! чертов склероз!
А вы можете послать собранный ices 0.4 на почту roman-romkin@mail.ru спасибо. а то у меня очень долго собираться будет….