Как я был радистом

Нашел в веб-архиве свою старую статью про настройку радио на FreeBSD. Пока не потерлась — выложу здесь, авось кому пригодится.


Поставили как-то задачу: взять с микшерного пульта радиохолдинга 3 радиоканала и вещать их в сеть. После танцев с бубном вокруг Shoutcast-a был выбран все-таки Icecast, т.к. ogg ест меньше трафика и звучит лучше.

Для тех, кто о онлайн-радио имеет довольно смутное понятие, опишу схему его работы.
Состоит оно из 3 частей — источника звука, источника потока и ретранслятора. Может не так назвал, но суть от этого не меняется.

1. Источник звука. Микрофон, аудиофайл, другое онлайн-радио, линейный вход и т.д. — звук можно брать откуда угодно.
2. Источник потока. Демон, который берет сигнал из источника звука, если надо, меняет ему качество, битрейт, кол-во каналов и пр. — и отправляет на ретранслятор.
3. Ретранслятор. Демон, к которому коннектятся пользователи в поисках счастья и музыки. :-))

В моем случае звук берется с линейного входа, оцифровывается демоном Ices и отправляется на Icecast для ретрансляции.

Итак, поехали.

# cd /usr/ports/audio/icecast2 && make install clean
# cd /usr/ports/audio/ices && make install clean

Далее собственно конфиги:

# cat /usr/local/etc/icecast.xml
<icecast>
<limits>
<clients>400</clients>
<sources>4</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>0</burst-on-connect>
<burst-size>65535</burst-size>
</limits>

<authentication>
<!— Sources log in with username ‘source’ —>
<source-password>k7sgw3onpfbos7ed</source-password>
<!— Relays log in username ‘relay’ —>
<relay-password>w938vo4rybiof4y3tf</relay-password>

<!— Admin logs in with the username given below —>
<admin-user>admin</admin-user>
<admin-password>d3rp9r0l</admin-password>
</authentication>

<!— This is the hostname other people will use to connect to your server.
It affects mainly the urls generated by Icecast for playlists and yp
listings. —>
<hostname>jazz.td.net.ua</hostname>

<listen-socket>
<port>8000</port>
</listen-socket>

<mount>
<mount-name>/hit-fm-64k.ogg</mount-name>
<max-listeners>400</max-listeners>
<burst-size>65536</burst-size>
<hidden>0</hidden>
<no-yp>1</no-yp>
</mount>

<mount>
<mount-name>/hit-fm-128k.ogg</mount-name>
<max-listeners>400</max-listeners>
<burst-size>65536</burst-size>
<hidden>0</hidden>
<no-yp>1</no-yp>
</mount>

<mount>
<mount-name>/rusradio-64k.ogg</mount-name>
<max-listeners>400</max-listeners>
<burst-size>65536</burst-size>
<hidden>0</hidden>
<no-yp>1</no-yp>

<mount>
<mount-name>/kiss-fm-64k.ogg</mount-name>
<max-listeners>400</max-listeners>
<burst-size>65536</burst-size>
<hidden>0</hidden>
<no-yp>1</no-yp>
</mount>

<fileserve>1</fileserve>

<paths>
<!— basedir is only used if chroot is enabled —>
<basedir>/usr/local/share/icecast</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</logdir>
<webroot>/usr/local/share/icecast/web</webroot>
<adminroot>/usr/local/share/icecast/admin</adminroot>
<!— <pidfile>/usr/local/share/icecast/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:port/ to
the status page
—>
<alias source=»/» dest=»/status.xsl»/>
</paths>

<logging>
<accesslog>icecast-access.log</accesslog>
<errorlog>icecast-error.log</errorlog>
<!— <playlistlog>playlist.log</playlistlog> —>
<loglevel>4</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>

 

Небольшие пояснения — радиостанций у меня было 3, одну из них надо было транслировать в 2 битрейтах. Не знаю, зачем оно в случае с ogg — разницы между 64 и 256 не слышно, но такова была постановка задачи.

Теперь типичный файл конфигурации ices:

# cat /usr/local/etc/ices-oss-hit.xml
<?xml version=»1.0″?>
<ices>

<!— run in background  —>
<background>0</background>
<!— where logs go. —>
<logpath>/var/log</logpath>
<logfile>ices.log</logfile>
<!— size in kilobytes —>
<logsize>2048</logsize>
<!— 1=error, 2=warn, 3=infoa ,4=debug —>
<loglevel>4</loglevel>
<!— logfile is ignored if this is set to 1 —>
<consolelog>0</consolelog>

<!— optional filename to write process id to —>
<!— <pidfile>/home/ices/ices.pid</pidfile> —>

<stream>
<metadata>
<name>Hit FM Radio</name>
<genre>Hits</genre>
<description>Hit FM UA</description>
<url>http://www.hitfm.ua</url>
</metadata>

<input>
<module>oss</module>
<param name=»rate»>44100</param>
<param name=»channels»>2</param>
<param name=»device»>/dev/dsp1.0</param>
<!— Read metadata (from stdin by default, or —>
<!— filename defined below (if the latter, only on SIGUSR1) —>
<param name=»metadata»>0</param>
<param name=»metadatafilename»>test</param>
</input>

<instance>
<hostname>localhost</hostname>
<port>8000</port>
<password>k7seo837tf54vied</password>
<mount>/hit-fm-64k.ogg</mount>
<yp>1</yp>

<encode>
<quality>0</quality>
<samplerate>44100</samplerate>
<channels>2</channels>
</encode>

<downmix>0</downmix>
</instance>

<instance>
<hostname>localhost</hostname>
<port>8000</port>
<password>k7senpfboi8s7ed</password>
<mount>/hit-fm-128k.ogg</mount>
<yp>1</yp>

<encode>
<quality>5</quality>
<samplerate>44100</samplerate>
<channels>2</channels>
</encode>

<downmix>0</downmix>
</instance>

</stream>

</ices>

В принципе вуаля, осталось запустить.

Добавляем icecast_enable=»YES» в /etc/rc.conf и пишем стартап-скрипт для ices:

# cat /usr/local/etc/rc.d/zzzz.ices.sh
#!/bin/sh

/usr/sbin/mixer -f /dev/dsp0 =rec line
/usr/sbin/mixer -f /dev/dsp1 =rec line
/usr/sbin/mixer -f /dev/dsp2 =rec line

echo «HIT FM»
/usr/local/bin/ices /usr/local/etc/ices-oss-hit.xml &
sleep 1

echo «Russian Radio»
/usr/local/bin/ices /usr/local/etc/ices-oss-russian.xml &
sleep 1

echo «KISS FM»
/usr/local/bin/ices /usr/local/etc/ices-oss-kiss.xml &

dsp0-2, соответственно, звуковые карты.

Вам также может понравиться

Об авторе jared

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *