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

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 и выше все библиотеки есть в репозиториях, поэтому ставим:

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 &#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 мы сделаем это автоматически, добавляем в конфиг следующие строки:

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 —>
 
<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, переходим в папку и создаем наш плэйлист:

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 &#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"; ?>

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

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 &#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)
Теперь даем права на выполнение скрипта:

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?