Делаем свое интернет радио.
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 и выше все библиотеки есть в репозиториях, поэтому ставим:
1 2 3 | apt-get install libshout-dev apt-get install libmp3lame-dev apt-get install libxml2-dev |
Debian.
В Debian 6.0 так же есть в репозитории, только его нужно добавить:
1 | nano /etc/sources .list |
И вниз списка добавляем:
1 | deb http: //www .deb-multimedia.org squeeze main non- free |
Сохраняем результат(control + X y) и устанавливаем ключ репозитория:
1 2 3 | 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 |
После чего обновляем список пакетов:
1 2 | apt-get update apt-get upgrade |
И устанавливаем наши библиотеки:
1 | apt-get install libshout-dev libmp3lame-dev libxml2-dev |
IceCast 2.
Установка icecast2.
К счатью, Icecast server есть в репозиториях, поэтому ставим его командой:
1 | apt-get install icecast2 |
При этом, во время установки, Icecast создаст пользователя и группу Icecast.
Настройка Icecast.
Открываем для редактирования конфиг Icecast2:
1 | nano /etc/icecast2/icecast .xml |
И видим наш конфиг(ниже приведу его полностью с пометками):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | < 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 мы сделаем это автоматически, добавляем в конфиг следующие строки:
1 2 3 4 5 6 7 8 9 | < mount > < mount-name >/live</ mount-name > < fallback-mount >/nonstop</ fallback-mount > < fallback-override >1</ fallback-override > </ mount > |
Где /live это исходная точка (та с которой перекидываем) , а /nonstop точка назначения. На этом вся настройка fallback-mount закончена. Теперь пришло время для кодировки.
Настройка кодировки IceCast.
Очень часто бывает, что воспроизводимая песня отображается не правильно, или не отображается совсем, как на картинке ниже:
Что бы исправить это досадную оплошность, можно принудительно выставить кодировку для точки монтирования, например для /live это будет выглядить так :
1 2 3 4 5 6 7 8 9 10 11 | < 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 можно установить другой пароль на определенную точку,название канала,музыки,радио :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | < 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 выполняем команды:
1 2 3 4 5 6 7 | 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 , копируем его :
1 | cp /usr/local/etc/ices .conf.dist /usr/local/etc/ices .conf |
И открываем для редактирования:
1 | nano /usr/local/etc/ices .conf |
Опять же приведу конфиг целиком с пометками с важных местах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | <? 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 —> <!— 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, переходим в папку и создаем наш плэйлист:
1 2 | cd /mnt/music/nonstop ls > playlist.txt |
После выполнения команды, у нас появится файл playlist.txt, в котором будет список всего содержимого папки /mnt/music/nonstop.
Запуск.
Icecast2.
Для запуска Icecast2, сначала надо разрешить ему запуск , для этого открываем:
1 | nano /etc/default/icecast2 |
И правим параметр # Change this to true when done to enable the init.d script
ENABLE=true , должно получиться вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 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 командой:
1 | service icecast2 start |
Для проверки запущен-ли сервер можно перейти по адресу, который Вы указали при настройке вашего сервера, например http://pipradio.net:9500 , где должен открыться веб интерфейс icecast.
Ices0.4
Если ices будет у Вас вещать только один канал, то его можно запустить командой:
1 | ices |
Но если у Вас несколько каналов, и соответственно несколько конфигов, то запускается ices командой:
1 | ices -c /usr/local/etc/ices .conf |
Где /usr/local/etc/ices.conf пусть до вашего конфига.
На этом настройка завершена. Переходим к статистике.
Статистика.
Практически с самого первого запуска сервера радио, я ломал голову, как сделать учет и подсчет статистики слушателей. На помощь пришел MRTG, программа, первоначально созданная для подсчета трафика и чтения логов.
Установка MRTG.
Установить MRTG в debian и ubuntu можно командой :
1 | apt-get install mrtg |
На этом собственна и вся установка, так что переходим к настройке.
Настрока MRTG
После установки файл конфигурации MRTG должен находит в /etc/mrtg.cfg, отредактируем его:
1 | nano /etc/mrtg .cfg |
ВАЖНО!
Если собираетесь использовать MRTG только для снятия статистики IceCast2, то можете смело удалять все содиржимое конфига, и вставить следующие строки:
1 2 3 4 5 6 7 8 9 10 | 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: |
Тут не много объясню, что к чему.
1 | Interval: 5 |
Время обновления графиков в минутах.
1 | RunAsDaemon: yes |
Стартовать MRTG как демон.
1 | WorkDir: /var/www/pipradio .net /web/statistica |
Папка куда будут складываться файлы.(можно создать например поддомен ice.pipradio.com)
1 2 | XSize[_]: 600 YSize[_]: 200 |
Размер графиков.
Теперь создаем скрипт, который будет собирать статистику радио со всех потоков:
1 | nano /etc/allstat .php |
И втсавляем следующие:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/usr/bin/php < ?php $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" ; ?> |
Если же вы хотите снимать статистику с какого-то одного потока, то скрипт будет выглядить так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/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)
Теперь даем права на выполнение скрипта:
1 | chmod 755 /etc/allstat .php |
И добавляем наш скрипт в конфиг MRTG:
1 | nano /etc/mrtg .cfg |
Вниз вставляем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
1 | env LANG=C /usr/bin/mrtg /etc/mrtg .cfg |
Если ошибок вида Target[all][_IN_] ‘ $target->[1]{$mode}
нет ,значит все хорошо, если есть, проверьте ваш сервер, и в случаи снятия статистики с отдельного потока, проверьте есть ли он.
Теперь нам нужно создать файл index.html, для этого используем команду:
1 | 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
можно и так, однако, я в скрипт добавил бы еще обновление плэйлиста
Спасибо! Все сделал по инструкции, но не пойму, как подцепиться с удаленного сервера во время воспроизведения плейлиста!? не пускает(
Не могли бы перефразировать вопрос ? я что-то не понял чего вы хотите добиться