организация вещания потокового аудио в локальной сети
Хотелось бы поделиться своим опытом в установке и настройке сервера потокового аудио 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