Эту статью я написал для журнала “Сетевые решения”.
Хотелось бы поделиться своим опытом в установке и настройке сервера потокового аудио IceCast. В нашей локальной сети находится несколько десятков компьютеров. Основная масса – под управлением ОС семейства Windows. Мой рабочий компьютер – полигон для испытания различных сервисов. Однажды после прослушивания потокового аудио через Интернет я задался вопросом, можно ли организовать нечто подобное в масштабе нашей сети. Это ведь здорово - разобраться как работает такой интересный интернет-сервис. Итак, приступим к поискам нужного ПО.
Я использую программу управления пакетами aptitude, но вы вольны воспользоваться любой другой, которую предоставляет ваш любимый дистрибутив. Итак, я направляюсь прямиком в раздел Audio, и что я вижу там? Порядка 300 пакетов для работы с аудио! Трудный выбор. Начинаем просмотр пакетов по порядку. Плееры, синтезаторы, аудиомикшеры, плагины, front-end’ы к различным консольным аудиопрограммам и сами консольные утилиты. Черт как же тяжело сделать выбор между ними – по ходу дела все хочется поставить и попробовать, но не отвлекаемся, а ищем сервер потокового аудио. После моих изысканий нарисовался небольшой списочек. Так-с:
DarkIce;
Gnump3d;
IceCast;
slimp3
Вооружаемся словарем и пытаемся понять, что написано в описаниях пакетов.
DarkIce – захватывает аудиопоток из звуковой карты, кодирует в mp3/oggVorbis и посылает серверу потокового аудио IceCast – немного не то… (но тоже может пригодиться).
Gnump3d – сервер, который предоставляет веб-интерфейс к коллекции музыкальных файлов на нашем жестком диске – тоже не то.
Остаются IceCast2 и slimp3 – и это, похоже, то, что нам нужно.
Файлы из музыкальной коллекции передаются, посредством указания их в плейлисте, так называемому streamer’у, в качестве которого предлагаю использовать Ices. Ices кодирует их и посылает серверу потокового аудио IceCast. К серверу IceCast подключаются клиентские машины, с которых возможно прослушивание музыки.
Попробуем разобраться, как настроить IceCast. А что если в лоб?
Code: # 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. Я немного покромсал этот файл и убрал из него все лишнее.
Рассмотрим его подробнее с пояснениями по ходу дела.Code: <icecast> <limits> Секция ограниченийCode: <clients>50</clients> Количество одновременно подключенных пользователей. Выставляем желаемое. Сеть небольшая – поставлю-ка я 50.Code: <sources>2</sources> Количество обрабатываемых сервером аудиопотоков. Я хотел бы организовать 2 разных потока аудио, поэтому ставлю 2.Code: <threadpool>5</threadpool> Количество потоков, запускаемых сервером для поддержания соединений с клиентами. В оригинальных комментариях к файлу значение 5 рекомендовано для серверов с малым и средним траффиком. Оставлю 5.Code: <queue-size>102400</queue-size> Максимальный размер (в байтах) очереди для клиентов, подключенных к нашему серверу. Оставляем значение по умолчанию.Code: <header-timeout>15</header-timeout> Максимальное время ожидания в секундах для запросов от клиентов. Оставляю без изменений.Code: <source-timeout>10</source-timeout> Если подключенный к серверу аудиопоток не посылает данные 10 секунд, этот аудиопоток удаляется. Оставляем как есть.Code: </limits> <authentication> Аутентификация - следующая секция конфигурационного файла. В ней описывается, как аудиопотоки должны авторизовываться на сервере и как администратор может управлять ими.Code: <source-password>mypass</source-password> Пароль для присоединения потока к аудиосерверу IceCast. Можно выбрать действительно хороший пароль при помощи утилиты apg, описанной в 6 номере «Сетевых решений». Нечто вроде !+2Nx1h@I{](C. Я же ограничился простым паролем mypass :).Code: <relay-password>mypass</relay-password> Пароль, используемый для пересылки аудиопотоков между локальным IceCast-сервером и другим IceCast-сервером. Эти пароли на обоих серверах должны совпадать. Такую фичу я пока использовать не могу (внешний канал в Интернет слабоват).Code: <admin-user>admin</admin-user> Логин администратора, обслуживающего сервер. По умолчанию admin. Оставим как есть. Это имя используется также для входа на локальный, основанный на XSL, сайт IceCast.Code: <admin-password>nopass</admin-password> Пароль администратора. Используется для всех административных функций. Пароль по умолчанию hackme – мне такого рода пароли крайне не нравятся, поэтому меняю на нечто менее позорное – nopass. Можно опять же воспользоваться apg и сгенерировать пароль потяжелее :)Code: </authentication> Далее следуют все остальные настройки сервера.Code: <hostname>192.168.1.229</hostname> Здесь все просто – имя машины (Fully Qualified Domain Name или IP-адрес). В моей сети используется 192.168.1.229. В вашей сети настройки, конечно, будут другими.Code: <listen-socket> <port>8000</port> Настройка номера TCP-порта. Значение по умолчанию 8000.Code: <bind-address>192.168.1.229</bind-address> Привязка к сетевому адресу. Если параметр не указан, используется значение hostname. Поставим для страховки 192.168.1.229.Code: </listen-socket> <mount> В этой секции меня заинтересовали некоторые параметры, которые придают нашему серверу профессиональный вид. Здесь задаются специальные параметры для точек монтирования. Пока точка монтирования у нас одна – она описывается далее в файле настроек Ices.Code: <mount-name>/paradiselost.ogg</mount-name> Имя точки монтирования.Code: <username>source</username> Имя пользователя – оставляем source.Code: <password>mypass</password> Пароль – в моем случае mypass.Code: <intro>/intro.ogg</intro> Интересный параметр, в котором следует указать имя файла, который должен быть помещен в каталог webroot - в моем случае это каталог /home/kirill/icecastwebroot.
Этот файл будет проигрываться всем новым пользователям, которые подключаются к нашему аудиосерверу. В этот файл я записал свое приветствие слушателям.Code: <fallback-mount>/fall.ogg</fallback-mount> В этом параметре также указывается имя файла, который должен находиться в каталоге webroot. Этот файл будет проигран клиентам в том случае, если что-то пошло не так и нормальный аудиопоток недоступен. В этот файл лично я записал сообщение “Аудиопоток недоступен – попробуйте присоединиться позже” и добавил свой любимый аудиотрек.Code: </mount> <paths> Секция «Пути».Code: <logdir>/var/log/icecast</logdir> Каталог для записи логов (всегда есть куда глянуть, если что-то пойдет не так).Code: <webroot>/home/kirill/icecastwebroot</webroot> В этой директиве определяется базовый каталог для статических файлов. Этот каталог может содержать любые файлы. Допустим, мы указали в этой директиве /home/kirill/icecaswebroot. Если теперь в строке браузера указать http://192....xample.mp3, то на компьютер клиента будет загружен файл /home/kirill/icecastwebroot/mp3/example.mp3.Code: <adminroot>/home/kirill/icecastwebroot/admin</adminroot> В этой директиве указывается каталог для инструментов администрирования. При инсталляции IceCast устанавливается ряд скриптов в формате XSL для администрирования сервера через веб.
Если поместить эти скрипты (в моем случае) в /home/kirill/icecastwebroot/admin, то в панель веб-администрирования можно будет попасть, набрав в строке браузера http://192....000/admin/.Code: <pidfile>/usr/local/share/icecast/icecast.pid</pidfile> В этой строке задается имя и путь к так называемому pid-файлу, который создается при старте и удаляется при завершении работы сервера. Файл содержит process ID сервера, который используется для посылки сигналов серверу.Code: </paths> <logging> Секция мониторинга.Code: <accesslog>access.log</accesslog> Лог доступа с серверу.Code: <errorlog>error.log</errorlog> Лог ошибок.Code: <playlistlog>playlist.log</playlistlog> Лог проигрываемых аудиофайлов.Code: <loglevel>4</loglevel> Что будет записываться в логи. От 4 - максимум отладочной информации - и до 1 – только ошибки.Code: </logging> <security> Секция «безопасность».Code: <chroot>0</chroot> Указывает, будет ли использоваться chroot(). Директория, в которую делается chroot, указывается в директиве .Code: <changeowner> <user>kirill</user> <group>kirill</group> </changeowner> Эта директива указывает серверу от чьего имени и группы стартовать. Следует указывать реально существующих пользователей. Я решил не добавлять пользователей, а запускать сервер от своего имени.Code: </security> </icecast> Я записываю этот файл в свой домашний каталог под именем mynewicecastconfig. Ну вроде все! Можно попробовать стартовать сервер следующей командой:Code: #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 открыт -Code: 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....000/admin/, мы можем попасть в административный интерфейс.
Итак сервер IceCast настроен – теперь надо заставить его что-нибудь проиграть. Для этого требуется на этот самый сервер послать поток аудиоданных. После недолгих копаний в интернете и в списке пакетов я нашел то, что мне было нужно – Ices. Установка Ices прохоходит стандартным для Linux образом:Code: ./configure make make install Попробуем запустить программу:Code: #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” Понятно – опять требуется файл конфигурации. Рассмотрим его подробнее.Code: <?xml version="1.0"> <ices> <background>1</background> Тут все понятно – запускать ли ices в фоне. Мне как раз это и нужно – ставлю 1.Code: <logpath>/var/log/ices</logpath> Куда записывать логи.Code: <logfile>ices.log</logfile> Имя лог файла.Code: <loglevel>4</loglevel> Уровень записи отладочных сообщений. 1 - ошибки, 2 - предупреждения, 3 - информация, 4 - отладочные сообщения. Ставлю 4 – потом всегда можно изменить.Code: <consolelog>0</consolelog> Установка этого флага в 1 заставляет Ices выводить сообщения в консоль. Не хочу – ставлю 0.Code: <pidfile>/home/ices/ices.pid</pidfile> Имя файла для записи PID. Оставлю как есть. Для моих нужд этот файл не потребуется.Code: <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 – ссылочка на сайт.Code: <input> Эта секция отвечает за получение исходных аудиоданных. Есть два варианта:
1) аудиоинформация снимается со звуковой карты;
2) используется плейлист.
Поддерживается два типа плейлистов:
- basic - обыкновенный текстовый файл с именами музыкальных файлов;
- script - используется вывод какого-либо скрипта либо команды, возвращающей имя файла.
Для моих целей подходит значение basic.Code: <module>playlist</module> <param name=”type”>basic</param> <param name=”file”>/home/kirill/playlist.txt</param> Имя файла плейлиста.Code: <param name=”random”>1</param> Случайный порядок проигрывания. Поставлю ка я это значение равным 1 для непредсказуемости нашего аудиовещания.Code: <param name=”restart-after-reread”>0</param> Если файл плейлиста изменился, то воспроизведение начнется с начала. Ставим что хотим. Лично я поставил 0.Code: <param name=”once”>0</param> Если этот параметр имеет значение 1, то после проигрывания всего плейлиста будет произведен выход из программы. Меня это не устраивает – ставлю 0.Code: </input> <instance> В этой секции можно определить один или несколько аудиопотоков. Эти потоки можно направить в разные точки монтирования на сервер Icecast.Code: <hostname>192.168.1.229</hostname> Имя хоста на котором запущен сервер IceCast. В моем случае это 192.168.1.229.Code: <port>8000</port> Порт на котором работает IceCast.Code: <password>mypass</password> Пароль для соединения с сервером. Вспоминаем что писали в файле конфигурации IceCast. Я использовал пароль mypass, поэтому его и прописываю.Code: <mount>/paradiselost.ogg</mount> Имя аудиопотока. Используя это имя, клиенты будут прослушивать музыку. Использую /paradiselost.ogg.Code: <reconnectdelay>2</reconnectdelay> Если что-то пошло не так (сетевые проблемы и т.п.) и ices потерял соединение с сервером IceCast, эти параметры контролируют, через сколько секунд и сколько раз следует повторять соединение. Если установить значение “– 1” то попытки соединения будут повторяться бесконечно. Оставлю значения по умолчанию.Code: <maxqueuelength>80</maxqueuelength>
Максимальная длина очереди. Параметр для продвинутых пользователей, к коим я себя не отношу. Оставим по умолчанию.Code: <encode> <nominal-bitrate>64000</nominal-bitrate> <samplerate>44100</samplerate> <channels>2</channels> Параметры кодирования. Номинальный битрейт, частота, количество каналов.Code: </encode> </instance> </stream> </ices> Запишем этот файл в /home/kirill/icesconfig.
Ну вот, с файлом конфигурации Ices мы закончили. Теперь стоит задача сформировать плейлист. Это можно сделать различными способами. Я создавал два плейлиста при помощи команд:Code: # locate *.ogg | grep paradise_lost > /home/kirill/playlist.txt # locate *.ogg | grep oggs > /home/kirill/all_ogg_files.txt Первый плейлист – треки исполнителя Paradise Lost, второй – все файлы ogg vorbis из моей музыкальной коллекции.
Уфф!, теперь точно почти все готово – попробуем запустить ices.
Ошибок при запуске ices не последовало. Переходим к тестированию. Запускаем XMMS, жмем Ctrl-L и вводим в строку http://192....selost.ogg.
С замиранием сердца жмем play…
Ура! Проигрывается intro.ogg, а потом из колонок льются мощные аккорды! Получилось! Теперь пробуем соединиться с сервером с других компьютеров – все OK.
Но это еще не все. Я хотел организовать 2 аудиопотока – paradiselost.ogg и all.ogg (для этого я и создавал два разных плейлиста. Сколько я не пытался прописать в файле конфигурации Ices два аудиопотока, мне так это и не удалось. Вернее получилось создавать два одинаковых с разным битрейтом. После поисков в интернет я нашел решение, и очень удивился, почему я до него не дошел сам. Решение следующее – запускать два процесса Ices – и каждому из процессов указывать свой файл конфигурации. После этого все прекрасно заработало. Дело осталось за малым – добавить запуск IceCast и Ices в инициализационные скрипты, либо вручную создать скрипт, который бы проделывал всю работу по запуску IceCast и Ices. Мой скрипт для запуска выглядит следующим образом:Code: 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 или другой доступной утилитой, коих, надеюсь, в вашем дистрибутиве предостаточно).
В статье были использованы материалы сайта www.icecast.org.
программы, совместимые с 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.
|