|
|
www.lissyara.su
—> статьи
—> FreeBSD
—> программы
—> Icecast2 + Darkice
Подъем интернет-радиостанции с возможностью ретрансляции внешний станций
Автор: unkn0wn.
Однажды вечером, сидя в рздумьях, что ты такое натворить, в моей голове созрел план поднять Инет-радиостанцию. Сказано - сделано. Инет был перерыскан на тему потоковых серверов и сорс-клиентов к ним, и выбор пал на связку Icecast2+Darkice. Shoutcast отвалился сразу по причине примитивного конфига, и двухдневного марафона на тему "Как же тебе всунуть этот аудиопоток!", ибо к нему никто из сорсов не хотел подключаться, а Darkice был выбран по причине того, что меня прельстили удобный конфиг, возможность записи радиопередач в отдельные файлы, и то, что связка с Icecast заработала сразу без какого бы то ни было точения напильником.
Первым делом, была выбрана схема с двумя серверами Icecast2. Дело в том, что Darkice выпадает по signal 6 после того, как более 6 минут не может подключиться в серверу вещания, плюс во время установления соединения в файл эфира он пишет полную чушь, потому было принято решение вещать по схеме (Darkice)->локальный Icecast -> релей с внешнего Icecast, впрочем, эту схему легко поправить.
Часть 1. Настройка машины в локальной сети
=================================================================
Первым делом пошел в /usr/ports/audio/icecast2, сделал make install clean, и (о чудо!) через несколько минут сборки icecast2 собрался и установлся. Дальше путь мой лежал в /usr/local/etc/, в котором я создал файл icecast.xml следующего содержимого:
<icecast>
<limits>
<clients>100</clients>
<sources>2</sources>
<threadpool>5</threadpool>
<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-password>123456</source-password>
<relay-password>hackme</relay-password>
<admin-user>admin</admin-user>
<admin-password>hackme</admin-password>
</authentication>
<hostname>localhost</hostname>
<listen-socket>
<port>8000</port>
<bind-address>192.168.0.253</bind-address>
</listen-socket>
<mount>
<mount-name>/MyRadio</mount-name>
<max-listeners>2</max-listeners>
<burst-size>65536</burst-size>
</mount>
<fileserve>1</fileserve>
<paths>
<basedir>/var/icecast</basedir>
<logdir>/log</logdir>
<webroot>/web</webroot>
<adminroot>/admin</adminroot>
<pidfile>/run/icecast.pid</pidfile>
<alias source="/" dest="/status.xsl"/>
</paths>
<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<loglevel>2</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
<logsize>10000</logsize> <!-- Max size of a logfile -->
<logarchive>1</logarchive>
</logging>
<security>
<chroot>1</chroot>
<changeowner>
<user>icecast</user>
<group>icecast</group>
</changeowner>
</security>
</icecast>
| После этого были созданы пользователь icecast, группа icecast, папки /var/icecast/log, /var/icecast/web, /var/icecast/admin и /var/icecast/run, в них было скопировано содержимое папки /usr/local/share/icecast, и сделано
chown -R icecast:icecast /var/icecast
| .
Итак, сервер у нас есть, остается подать ему поток. В портах лежит занимательная программа - Darkice. Идем в /usr/ports/audio/darkice, вбиваем в консоли
, и вот Darkice уже стоит. Немного пошаманил с конфигом /usr/local/etc/darkice.cfg, и вот что получилось:
# this section describes general aspects of the live streaming session
[general]
duration = 0 # длительность оцифровки в секундах, 0 - бесконечно
bufferSecs = 5 # длительность внутренней буферизации, в секундах
reconnect = yes # переподключаться в случае дисконнекта с сервером
realtime = no # оцифровка в режиме реального времени или нет
# this section describes the audio input that will be streamed
[input]
device = /dev/dsp0 # устройство OSS DSP звуковой карты
sampleRate = 44100 # частота дискретизации в Герцах: 11025, 22050 или 44100
bitsPerSample = 16 # бит на семпл, 8 или 16
channel = 2 # каналов: 1 = моно, 2 = стерео
[icecast2-0]
bitrateMode = cbr # тип кодирования, допустимы vbr/abr/cbr
format = mp3 # формат потока: mp3/ogg
bitrate = 128 # битрейд потока
server = 192.168.0.253 # имя хоста, на котором поднят Icecast2 (допустим IP-адрес)
port = 8000 # порт, на котором слушает сервер IceCast2, обычно 8000
password = 123456 # пароль для учетной записи source на сервере IceCast2
mountPoint = MyRadio # точка монтирования на сервере IceCast2
name = MyRadio # название потока
description = MyRadio # описание потока
url = http://none # произвольный адрес
genre = misc # жанр
public = no # публиковать на dir.xith.org или нет?
| Конфиг простой до безобразия: надо указать звуковое устройство (/dev/dsp0), адрес и порт сервера, логин/пароль к нему и точку монтирования. Пароль берем из секции <authentication>, поля <source-password>
* Если поставите realtime = yes - гарантированно получите 100%-ую загрузку процессора, с чем это связано - так и не выяснил, связывался с автором - он ничего толком не объяснил
Для запуска darkice был накатан сей скрипт, названный darkice.sh:
#!/bin/sh
# PROVIDE darkice
# REQUIRE amixer icecast2
case "$1" in
start)
/usr/local/bin/darkice -c /usr/local/etc/darkice.cfg >/dev/null &
echo $! > /var/run/darkice.pid
;;
faststart)
/usr/local/bin/darkice -c /usr/local/etc/darkice.cfg >/dev/null &
echo $! > /var/run/darkice.pid
;;
stop)
kill -TERM `cat /var/run/darkice.pid`
rm -f /var/run/darkice.pid
;;
*)
echo "Usage: ./darkice.sh start" >&2
;;
esac
| и положен в /usr/local/etc/rc.d
При первом запуске встала проблема, заключающаяся в том, что по умолчанию звук брался не с линейного входа, а с микрофонного, да и уровень по умолчанию зашкаливал, посему был написан сей скрипт, названный amixer.sh:
#!/bin/sh
# PROVIDE amixer
# BEFORE darkice
case "$1" in
start)
mixer -f /dev/dsp0 rec 55 line 55 mic 0 >/dev/null
mixer -f /dev/dsp0 -s =rec line >/dev/null
;;
faststart)
mixer -f /dev/dsp0 rec 55 line 55 mic 0 >/dev/null
mixer -f /dev/dsp0 -s =rec line >/dev/null
;;
*)
echo "Usage: amixer start" >&2
;;
esac
| и положен в /usr/local/etc/rc.d
* Если вы хотите брать звук с другого устройства и(ли) изменить уровень сигнала, поправьте строчку mixer -f /dev/dsp0 rec 55 line 55 mic 0 >/dev/null
Далее путь лежал в /etc/rc.conf, в которые былы вбиты следующие строки
icecast_enable="YES"
icecast_flags="-c /usr/local/etc/icecast.xml"
darkice_enable="YES"
amixer_enable="YES"
| Пускаем сперва Icecast, потом amixer, потом Darkice, топаем на http://192.168.0.253:8000, и наслаждаемся поднятой радиостанции. Если вы хотите вещать непосредственно с этой машины, то можно только поправить <max-listeners> и точку монтирования, и раздавать всем урлы вида http://192.168.0.253:8000, дабы люди ходили к вам за pls'ками, но в моем случае эта машина была в локальной сети, а поток надо было пробросить на внешний сервер.
Часть 2. Настройка машины во внешней сети
=================================================================
Недолго думая, на внешнем сервере поднимаю еще один Icecast2-сервер, пишу конфиг /usr/local/etc/icecast.xml:
<icecast>
<limits>
<clients>100</clients>
<sources>3</sources>
<threadpool>5</threadpool>
<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>
</limits>
<authentication>
<source-password>hackme</source-password>
<relay-password>hackme</relay-password>
<admin-user>admin</admin-user>
<admin-password>hackme</admin-password>
</authentication>
<hostname>radio.host.ru</hostname>
<listen-socket>
<port>8000</port>
<bind-address>83.176.111.8</bind-address>
</listen-socket>
<listen-socket>
<port>8001</port>
<bind-address>83.176.111.8</bind-address>
</listen-socket>
<relay>
<server>192.168.0.253</server>
<port>8000</port>
<mount>/MyRadio</mount>
<local-mount>/MyRadio</local-mount>
<on-demand>0</on-demand>
<relay-shoutcast-metadata>0</relay-shoutcast-metadata>
</relay>
<mount>
<mount-name>/MyRadio</mount-name>
<max-listeners>100</max-listeners>
<burst-size>65536</burst-size>
</mount>
<fileserve>1</fileserve>
<paths>
<basedir>/var/icecast</basedir>
<logdir>/logs</logdir>
<webroot>/web</webroot>
<adminroot>/admin</adminroot>
<pidfile>/run/icecast.pid</pidfile>
<alias source="/" dest="/status.xsl"/>
</paths>
<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<loglevel>1</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
<logsize>10000</logsize> <!-- Max size of a logfile -->
<logarchive>1</logarchive>
</logging>
<security>
<chroot>1</chroot>
<changeowner>
<user>icecast</user>
<group>icecast</group>
</changeowner>
</security>
</icecast>
| , и проведены аналогичные манипуляции с юзером/группой icecast и /var/icecast, как и выше.
ВАЖНО: Не забудьте сменить с конфигах Icecast'a и, соответственно, в Darkice'а пароли 123456 и hackme на что-то более серьезное!
Сразу оговорюсь, что эта машина имеет два интерфейса: один смотрит в локальную сеть, чтобы забирать поток с 192.168.0.253, другой во внешнюю.
Отличительная особенность этого конфига в том, что в нем появились секции <relay>...</relay>, назначение которых - указать серверу, откуда брать потом и в какую точку его монтировать, в данном случае указывает брать поток с 192.168.0.253:8000/MyRadio и монтировать его в локальную точку /MyRadio.
Пишем в /etc/rc.conf:
icecast_enable="YES"
icecast_flags="-c /usr/local/etc/icecast.xml"
| и делаем
/usr/local/etc/rc.d/icecast2 start
| После этого внешний Icecast-сервер берет поток с внутреннего сервера, и его ретранслирует. Людям раздаются урлы вида http://radio.host.ru:8000 либо http://83.176.111.8:8000/, чтобы они заходили на главную страницу сервера вещания и забирали оттуда .m3u-файлы вручную, либо самим зайти по данному адресу и выдернуть со страницы урлы на .m3u.
Можно заметить, что внешний сервер слушает на двух портах, в то время как внутренний только на одном. Проблема заключается в том, что Shoutcast открывает два порта, один какой прописан в конфиге, второй на единицу больше, и дабы не сбивать с толку плееры, заточенные под эту модель, была сделна эта поправка в конфигах.
Если есть желание ретранслировать радио, в секции <relay> в поле <server> надо указать сервер, откуда берете поток, а в поле <port> - соответственно порт сервера.
Касательно ретрансляции с различных серверов: если вы ретранслируете с сервера Icecast, то в поле <mount> надо указывать точку на удаленном сервере, если же с сервера Shoutcast - то просто /. Разница заключается в том, что Icecast - mount-based сервер, в то время как Shoutcast - port-based, то есть один экземпляр icecast может поддерживать практически неограниченое количество станций на одном порту, в то время как shoutcast придерживается идеологии "один порт - одна станция".
размещено: 2007-11-21,
последнее обновление: 2007-11-26,
автор: unkn0wn
|
|
|
|
2014-07-27, lissyara
gmirror
Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9
Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту
Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis
Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS
Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT
В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat
Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp
Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration
Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster
HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
2011-02-04, BlackCat
Восстановление ZFS
История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
|
Комментарии пользователей [13 шт.]