организация вещания потокового аудио в локальной сети


Хотелось бы поделиться своим опытом в установке и настройке сервера потокового аудио IceCast. В нашей локальной сети находится несколько десятков компьютеров. Основная масса – под управлением ОС семейства Windows. Мой рабочий компьютер – полигон для испытания различных сервисов. Однажды после прослушивания потокового аудио через Интернет я задался вопросом, можно ли организовать нечто подобное в масштабе нашей сети. Это ведь здорово - разобраться как работает такой интересный интернет-сервис. Итак, приступим к поискам нужного ПО.

Я использую программу управления пакетами aptitude, но вы вольны воспользоваться любой другой, которую предоставляет ваш любимый дистрибутив. Итак, я направляюсь прямиком в раздел Audio, и что я вижу там? Порядка 300 пакетов для работы с аудио! Трудный выбор. Начинаем просмотр пакетов по порядку. Плееры, синтезаторы, аудиомикшеры, плагины, front-end’ы к различным консольным аудиопрограммам и сами консольные утилиты. Черт как же тяжело сделать выбор между ними – по ходу дела все хочется поставить и попробовать, но не отвлекаемся, а ищем сервер потокового аудио. После моих изысканий нарисовался небольшой списочек. Так-с:
- DarkIce;
- Gnump3d;
- IceCast;
- slimp3.

Вооружаемся словарем и пытаемся понять, что написано в описаниях пакетов.

DarkIce – захватывает аудиопоток из звуковой карты, кодирует в mp3/oggVorbis и посылает серверу потокового аудио IceCast – немного не то... (но тоже может пригодиться).

Gnump3d – сервер, который предоставляет веб-интерфейс к коллекции музыкальных файлов на нашем жестком диске – тоже не то.

Остаются IceCast2 и slimp3 – и это, похоже, то, что нам нужно.

Общий принцип функционирования IceCast можно пояснить следующей упрощенной схемой (см. рис. 1).


Рис. 1.

Файлы из музыкальной коллекции передаются посредством указания их в плейлисте так называемому streamer’у, в качестве которого предлагаю использовать Ices. Ices кодирует их и посылает серверу потокового аудио IceCast. К серверу IceCast подключаются клиентские машины, с которых возможно прослушивание музыки.
Попробуем разобраться, как настроить IceCast. А что если в лоб?

# icecast
usage: icecast [-h -b -v] -c <file>
options:
-c <file> Specify configuration file
-h Display usage
-v Display version info
-b Run icecast in the background

Ага! Надо указать конфигурационный файл. Пример конфигурационного файла в XML формате, поставляемого с IceCast – icecast_minimal.in. Я немного покромсал этот файл и убрал из него все лишнее.
Рассмотрим его подробнее с пояснениями по ходу дела.

<icecast>
<limits>

Секция ограничений.

<clients>50</clients>

Количество одновременно подключенных пользователей. Выставляем желаемое. Сеть небольшая – поставлю-ка я 50.

<sources>2</sources>

Количество обрабатываемых сервером аудиопотоков. Я хотел бы организовать 2 разных потока аудио, поэтому ставлю 2.

<threadpool>5</threadpool>

Количество потоков, запускаемых сервером для поддержания соединений с клиентами. В оригинальных комментариях к файлу значение 5 рекомендовано для серверов с малым и средним траффиком. Оставлю 5.

<queue-size>102400</queue-size>

Максимальный размер (в байтах) очереди для клиентов, подключенных к нашему серверу. Оставляем значение по умолчанию.

<header-timeout>15</header-timeout>

Максимальное время ожидания в секундах для запросов от клиентов. Оставляю без изменений.

<source-timeout>10</source-timeout>

Если подключенный к серверу аудиопоток не посылает данные 10 секунд, этот аудиопоток удаляется. Оставляем как есть.

</limits>

<authentication>

Аутентификация - следующая секция конфигурационного файла. В ней описывается, как аудиопотоки должны авторизовываться на сервере и как администратор может управлять ими.

<source-password>mypass</source-password>

Пароль для присоединения потока к аудиосерверу IceCast. Можно выбрать действительно хороший пароль при помощи утилиты apg, описанной в 6 номере «Сетевых решений». Нечто вроде !+2Nx1h@I{](C. Я же ограничился простым паролем mypass :).

<relay-password>mypass</relay-password>

Пароль, используемый для пересылки аудиопотоков между локальным IceCast-сервером и другим IceCast-сервером. Эти пароли на обоих серверах должны совпадать. Такую фичу я пока использовать не могу (внешний канал в Интернет слабоват).

<admin-user>admin</admin-user>


Логин администратора, обслуживающего сервер. По умолчанию admin. Оставим как есть. Это имя используется также для входа на локальный, основанный на XSL, сайт IceCast.

<admin-password>nopass</admin-password>

Пароль администратора. Используется для всех административных функций. Пароль по умолчанию hackme – мне такого рода пароли крайне не нравятся, поэтому меняю на нечто менее позорное – nopass. Можно опять же воспользоваться apg и сгенерировать пароль потяжелее :)

</authentication>

Далее следуют все остальные настройки сервера.

<hostname>192.168.1.229</hostname>

Здесь все просто – имя машины (Fully Qualified Domain Name или IP-адрес). В моей сети используется 192.168.1.229. В вашей сети настройки, конечно, будут другими.

<listen-socket>

<port>8000</port>

Настройка номера TCP-порта. Значение по умолчанию 8000.

<bind-address>192.168.1.229</bind-address>

Привязка к сетевому адресу. Если параметр не указан, используется значение hostname. Поставим для страховки 192.168.1.229.

</listen-socket>

<mount>

В этой секции меня заинтересовали некоторые параметры, которые придают нашему серверу профессиональный вид. Здесь задаются специальные параметры для точек монтирования. Пока точка монтирования у нас одна – она описывается далее в файле настроек Ices.

<mount-name>/paradiselost.ogg</mount-name>

Имя точки монтирования.

<username>source</username>

Имя пользователя – оставляем source.

<password>mypass</password>

Пароль – в моем случае mypass.

<intro>/intro.ogg</intro>

Интересный параметр, в котором следует указать имя файла, который должен быть помещен в каталог webroot - в моем случае это каталог /home/kirill/icecastwebroot.
Этот файл будет проигрываться всем новым пользователям, которые подключаются к нашему аудиосерверу. В этот файл я записал свое приветствие слушателям.

<fallback-mount>/fall.ogg</fallback-mount>

В этом параметре также указывается имя файла, который должен находиться в каталоге webroot. Этот файл будет проигран клиентам в том случае, если что-то пошло не так и нормальный аудиопоток недоступен. В этот файл лично я записал сообщение “Аудиопоток недоступен – попробуйте присоединиться позже” и добавил свой любимый аудиотрек.

</mount>

<paths>

Секция «Пути».

<logdir>/var/log/icecast</logdir>

Каталог для записи логов (всегда есть куда глянуть, если что-то пойдет не так).

<webroot>/home/kirill/icecastwebroot</webroot>

В этой директиве определяется базовый каталог для статических файлов. Этот каталог может содержать любые файлы. Допустим, мы указали в этой директиве /home/kirill/icecaswebroot. Если теперь в строке браузера указатьhttp://192.168.1.229:8000/mp3/example.mp3,то на компьютер клиента будет загружен файл /home/kirill/icecastwebroot/mp3/example.mp3.

<adminroot>/home/kirill/icecastwebroot/admin</adminroot>

В этой директиве указывается каталог для инструментов администрирования. При инсталляции IceCast устанавливается ряд скриптов в формате XSL для администрирования сервера через веб.

Если поместить эти скрипты (в моем случае) в /home/kirill/icecastwebroot/admin, то в панель веб-администрирования можно будет попасть, набрав в строке браузераhttp://192.168.1.229:8000/admin/.

<pidfile>/usr/local/share/icecast/icecast.pid</pidfile>

В этой строке задается имя и путь к так называемому pid-файлу, который создается при старте и удаляется при завершении работы сервера. Файл содержит process ID сервера, который используется для посылки сигналов серверу.

</paths>

<logging>

Секция мониторинга.

<accesslog>access.log</accesslog>

Лог доступа с серверу.

<errorlog>error.log</errorlog>

Лог ошибок.

<playlistlog>playlist.log</playlistlog>

Лог проигрываемых аудиофайлов.

<loglevel>4</loglevel>

Что будет записываться в логи. От 4 - максимум отладочной информации - и до 1 – только ошибки.

</logging>

<security>

Секция «безопасность».

<chroot>0</chroot>

Указывает, будет ли использоваться chroot(). Директория, в которую делается chroot, указывается в директиве <basedir>.

<changeowner>
<user>kirill</user>
<group>kirill</group>
</changeowner>

Эта директива указывает серверу от чьего имени и группы стартовать. Следует указывать реально существующих пользователей. Я решил не добавлять пользователей, а запускать сервер от своего имени.

</security>

</icecast>

Я записываю этот файл в свой домашний каталог под именем mynewicecastconfig. Ну вроде все! Можно попробовать стартовать сервер следующей командой:

#icecast -c /home/kirill/mynewicecastconfig -b
Starting icecast2
Detaching from the console
# Changed groupid to 1000.
Changed userid to 1000.

Опция -b заставляет сервер запуститься в фоновом режиме. Внимательно просмотрите файл на предмет наличия незакрытых тегов, иначе IceCast стартовать не захочет.

Похоже, что все в порядке. В лог-файлах ошибок не наблюдается, в списке процессов появился icecast, nmap показывает, что порт 8000 открыт -

Starting nmap 3.81 (http://www.insecure.org/nmap/) at 2005-10-01 12:57 EEST
Interesting ports on Kirill (192.168.1.229):
(The 1653 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
25/tcp open smtp
................................
8000/tcp open http-alt

Nmap finished: 1 IP address (1 host up) scanned in 0.623 seconds

и вводя в строку браузераhttp://192.168.1.229:8000/admin/,мы можем попасть в административный интерфейс.

Итак сервер IceCast настроен – теперь надо заставить его что-нибудь проиграть. Для этого требуется на этот самый сервер послать поток аудиоданных. После недолгих копаний в интернете и в списке пакетов я нашел то, что мне было нужно – Ices. Установка Ices прохоходит стандартным для Linux образом:

./configure
make
make install

Попробуем запустить программу:

#ices2
IceS 2.0.1
(c) Copyright 2001-2004 The IceS Development Team <team@icecast.org>
Michael Smith <msmith@icecast.org>
Karl Heyes <karl@xiph.org>
and others

Usage: "ices config.xml"

Понятно – опять требуется файл конфигурации. Рассмотрим его подробнее.
<?xml version="1.0"?>
<ices>
<background>1</background>

Тут все понятно – запускать ли ices в фоне. Мне как раз это и нужно – ставлю 1.

<logpath>/var/log/ices</logpath>

Куда записывать логи.

<logfile>ices.log</logfile>

Имя лог файла.

<loglevel>4</loglevel>

Уровень записи отладочных сообщений. 1 - ошибки, 2 - предупреждения, 3 - информация, 4 - отладочные сообщения. Ставлю 4 – потом всегда можно изменить.

<consolelog>0</consolelog>

Установка этого флага в 1 заставляет Ices выводить сообщения в консоль. Не хочу – ставлю 0.

<pidfile>/home/ices/ices.pid</pidfile>

Имя файла для записи PID. Оставлю как есть. Для моих нужд этот файл не потребуется.

<stream>
<metadata>
<name>My Great Rock Stream</name>
<genre>ROCK</genre>
<description>IMHO My best music</description>
<url>http://xxx.xxx.com</url>
</metadata>

В секции metadata описывается мета-информация, передаваемая в IceCast:
- name – имя аудиопотока. С долей самолюбования запишу сюда My Great Rock Stream;
- genre – жанр (ROCK, конечно);
- description – описание аудиопотока;
- url – ссылочка на сайт.

<input>

Эта секция отвечает за получение исходных аудиоданных. Есть два варианта:
1) аудиоинформация снимается со звуковой карты;
2) используется плейлист.

Поддерживается два типа плейлистов:
- basic - обыкновенный текстовый файл с именами музыкальных файлов;
- script - используется вывод какого-либо скрипта либо команды, возвращающей имя файла.

Для моих целей подходит значение basic.

<module>playlist</module>
<param name="type">basic</param>
<param name="file">/home/kirill/playlist.txt</param>

Имя файла плейлиста.

<param name="random">1</param>

Случайный порядок проигрывания. Поставлю ка я это значение равным 1 для непредсказуемости нашего аудиовещания.

<param name="restart-after-reread">0</param>

Если файл плейлиста изменился, то воспроизведение начнется с начала. Ставим что хотим. Лично я поставил 0.

<param name="once">0</param>

Если этот параметр имеет значение 1, то после проигрывания всего плейлиста будет произведен выход из программы. Меня это не устраивает – ставлю 0.

</input>

<instance>

В этой секции можно определить один или несколько аудиопотоков. Эти потоки можно направить в разные точки монтирования на сервер Icecast.
<hostname>192.168.1.229</hostname>

Имя хоста на котором запущен сервер IceCast. В моем случае это 192.168.1.229.

<port>8000</port>

Порт на котором работает IceCast.

<password>mypass</password>

Пароль для соединения с сервером. Вспоминаем что писали в файле конфигурации IceCast. Я использовал пароль mypass, поэтому его и прописываю.

<mount>/paradiselost.ogg</mount>

Имя аудиопотока. Используя это имя, клиенты будут прослушивать музыку. Использую /paradiselost.ogg.

<reconnectdelay>2</reconnectdelay>
<

Если что-то пошло не так (сетевые проблемы и т.п.) и ices потерял соединение с сервером IceCast, эти параметры контролируют, через сколько секунд и сколько раз следует повторять соединение. Если установить значение “– 1” то попытки соединения будут повторяться бесконечно. Оставлю значения по умолчанию.

<maxqueuelength>80</maxqueuelength>

Максимальная длина очереди. Параметр для продвинутых пользователей, к коим я себя не отношу. Оставим по умолчанию.

<encode>
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<channels>2</channels>

Параметры кодирования. Номинальный битрейт, частота, количество каналов.

</encode>
</instance>

</stream>
</ices>

Запишем этот файл в /home/kirill/icesconfig.
Ну вот, с файлом конфигурации Ices мы закончили. Теперь стоит задача сформировать плейлист. Это можно сделать различными способами. Я создавал два плейлиста при помощи команд:

# locate *.ogg | grep paradise_lost > /home/kirill/playlist.txt
# locate *.ogg | grep oggs > /home/kirill/all_ogg_files.txt

Первый плейлист – треки исполнителя Paradise Lost, второй – все файлы ogg vorbis из моей музыкальной коллекции.
Уфф!, теперь точно почти все готово – попробуем запустить ices.

#ices2 /home/kirill/icesconfig

Ошибок при запуске ices не последовало. Переходим к тестированию. Запускаем XMMS, жмем Ctrl-L и вводим в строкуhttp://192.168.1.229:8000/paradiselost.ogg.

С замиранием сердца жмем play...

Ура! Проигрывается intro.ogg, а потом из колонок льются мощные аккорды! Получилось! Теперь пробуем соединиться с сервером с других компьютеров – все OK.

Но это еще не все. Я хотел организовать 2 аудиопотока – paradiselost.ogg и all.ogg (для этого я и создавал два разных плейлиста. Сколько я не пытался прописать в файле конфигурации Ices два аудиопотока, мне так это и не удалось. Вернее получилось создавать два одинаковых с разным битрейтом. После поисков в интернет я нашел решение, и очень удивился, почему я до него не дошел сам. Решение следующее – запускать два процесса Ices – и каждому из процессов указывать свой файл конфигурации. После этого все прекрасно заработало. Дело осталось за малым – добавить запуск IceCast и Ices в инициализационные скрипты, либо вручную создать скрипт, который бы проделывал всю работу по запуску IceCast и Ices. Мой скрипт для запуска выглядит следующим образом:

Icecast –c /home/kirill/mynewicecastconfig

Ices2 /home/kirill/icesconfig

Ices2 /home/kirill/icesconfig2

P.S.

Рассматриваемая в статье версия IceCast – 2.3.0.
В качестве streamer-а могут выступать DarkIce, Muse-Streamer и другие программы, найти и настроить которые вам теперь не составит труда (см. также врезку).

Streamer Ices2 на данный момент не поддерживает формат mp3. Так как в моей музыкальной коллекции содержатся только файлы формата Ogg Vorbis, то у меня никаких проблем не возникло. Если Ваша музыкальная коллекция содержит только mp3 файлы то есть 2 пути решения проблемы:
- выбор streamer’а, который поддерживает mp3 (например, Muse Streamer и др.);
- конвертация музыкальной коллекции в формат Ogg Vorbis (можно воспользоваться для этой цели конвертером sox или другой доступной утилитой, коих, надеюсь, в вашем дистрибутиве предостаточно).

Рабочие файлы конфигурации с моими комментариями можно загрузить отсюда:http://sutulo.at.tut.by/icecasconfig.tar.gz.
В статье были использованы материалы сайта www.icecast.org.
Если появились вопросы - пишите мне на sutulo@tut.by.

программы, совместимые с IceCast

Streamers:
- iceses, Unix,http://www.icecast.org/ices.php;
- Oddcast, Windows 98/NT/2000/XP,http://www.oddsock.org/tools;
- Muse, Unix,http://muse.dyne.org;
- Darkice, Unix,http://darkice.sourceforge.net/;
- SAM2, Windows 98/NT/2000/XP,http://www.spacialaudio.com;
- ezstream, Windows 98/NT/2000/XP Unix,http://www.icecast.org/ezstream.php;
- Nicecast, Mac OSX,http://www.rogueamoeba.com/nicecast/;
- IceGenerator, Unix,http://sourceforge.net/projects/icegenerator;
- Orban Opticodec-PC, Windows,http://www.orban.com/;
- freej, Unix,http://freej.org/.

Медиаплееры, которые работают с IceCast:
- foobar2000 (mp3 + ogg vorbis), Windows 98/NT/2000/XP,http://www.foobar2000.org;
- winamp 2.x, 5.x (mp3 + ogg vorbis), Windows 98/NT/2000/XP,http://www.winamp.com;
- XMMS(mp3 + ogg vorbis), Unix,http://www.xmms.org;
- Zinf(mp3 + ogg vorbis), Unix/Windows,http://zinf.sourceforge.net;
- Mplayer, Windows 98/NT/2000/XP Unix Mac OSX,http://www.mplayerhq.hu;
- Xine, Unix,http://www.xinehq.de;
- VLC, Windows 98/NT/2000/XP Unix Mac OSX,http://www.videolan.org.



Zwalker.
обсуждение статьи


Сетевые решения. Статья была опубликована в номере 10 за 2005 год в рубрике sysadmin

©1999-2024 Сетевые решения