СЕРГЕЙ ЯРЕМЧУК, фрилансер. Автор более 800 статей и шести книг. С «СА» с первого номера. Интересы: сетевые технологии, защита информации, свободные ОС
Лейся песня, или сервер потокового аудио своими руками
Чтобы покончить с бардаком, нужно возглавить его самому. Если пользователи по утрам, вместо того чтобы работать, выходят в Интернет в поисках новостей, что подчас съедает большую долю трафика, то почему бы не организовать свою ленту новостей на корпоративном сайте, понемногу пользователи привыкнут, и нагрузка на внешний канал уменьшится. Но новости и прочая текстовая информация еще ничего по сравнению с гигабайтами музыки, видео и прочего материала, который хотят протащить в сеть через узкий канал. Можно организовать фильтрацию, установить лимиты, все это иногда помогает, но гигабайты информации, при этом часто одинаковой, все равно собираются на жестких дисках компьютера, затрудняя архивацию.
Сегодня разберемся как создать сервер, который будет транслировать аудиопотоки.
В настоящее время существует достаточно большое количество приложений, позволяющих организовать такую трансляцию. Написаны они на разных языках программирования, работающих под управлением разных операционных систем, отличающихся лицензией, поддерживаемыми форматами и прочими характеристиками. Самый большой список, который мне удалось найти, размещен на странице http://sound.condorow.net/netaudio.html. Наиболее известным решением является использование веб-сервера Apache, модуль и необходимую информацию о настройках которого можно найти по адресам: http://www.tangent.org/mod_mp3 и http://sander.vanzoest.com/apachecon/2001. Другим не менее популярным решением является SHOUTcast от компании Nullsoft, подарившей миру WinAMP. Есть тяжеловес jetCast Server (http://jetaudio.com/download/jetcast.html), поддерживающий большое количество форматов, или простой в настройке и совместимый практически со всеми подобными серверами – AnaloxX SimpleServer:Shout (http://analox.com). Как видите, выбор есть.
В статье мы познакомимся с наиболее популярным Open Source-решением – Icecast (http://www.icecast.org). На данный момент Icecast поддерживает форматы Ogg Vorbis и MP3, при особой необходимости любой другой формат может быть добавлен без проблем, работает под управлением как Windows, так и UNIX-подобных систем, гибок и легок в настройке, имеет толковую документацию, распространяется в исходных кодах.
Кто есть кто
Механизм трансляции аудиопотоков имеет свои особенности, поэтому сначала разберемся, как это работает, и определимся с терминами. Любой сервер аудиопотоков, будь то Icecast или SHOUTcast, предназначен только для трансляции и работы с клиентами, которые подсоединяются, чтобы послушать музыку. Сервер не занимается поиском информации на жестком диске, кодированием и прочим, как это происходит с серверами, занимающимися трансляцией видео. Необходимую информацию ему нужно сначала переслать. Причем есть два варианта. Первый – использовать аналогичный сервер (впрочем, не все серверы на 100% совместимы между собой) в качестве источника информации. Такой сервер называется master relay. Можно забрать весь поток с сервера и перетранслировать его полностью или забрать только часть точек монтирования. Последний вариант также может понадобиться при неполной совместимости серверов. Например, если в качестве мастер-сервера для icecast будет выступать SHOUTcast, то весь поток забрать не получится, необходимо указывать отдельные точки монтирования. Да, что такое точка монтирования? Точка монтирования – это ресурс на сервере, который представляет один поток трансляции. Например, клиент хочет послушать музыку, запустив XMMS, нажимает , вводит http://cal.icecast.net:8630/prog1.ogg (ссылка рабочая) и слушает себе музыку. Параметр cal.icecast.net указывает на сервер, 8630 – на порт, используемый для трансляции (по умолчанию на большинстве серверов – 8000), а prog1.ogg на источник информации, это и есть точка монтирования. Причем если для mp3-потока указывать расширение не обязательно, то для ogg это требуется. Конечно же и наш сервер также может быть источником информации для других slave relay серверов. Такая схема принята по нескольким причинам, чтобы равномерно распределить клиентов, избежать дублирования информации на жестких дисках, не перегружать каналы, ведь проще забрать поток и перетранслировать его самому, чем позволить всем пользователям тащить это в одиночку. Другим источником информации для сервера могут быть так называемые source client или broadcasting tools. Но о них позже.
Установка Icecast
Для установки понадобятся: libxml2 (http://xmlsoft.org/downloads.html), libxslt (http://xmlsoft.org/XSLT/downloads.html), опционально curl (http://curl.haxx.se/download.html) и для работы с OggVorbis библиотеки с http://www.vorbis.com. Но не спешите скачивать, скорее всего, это уже есть в дистрибутиве. После скачиваем архив с icecast (670 Кб), распаковываем: ./configure, make, make install. После чего в каталоге /usr/local/bin/появится исполняемый файл icecast, конфигурационный файл icecast.xml в /usr/local/etc/, документация и файлы для администрирования будут положены в /usr/local/share/icecast/.
Конфигурируем Icecast
Единственный конфигурационный файл icecast.xml имеет одинаковую структуру как для Linux, так и для Windows. Состоит из нескольких секций, в которых сгруппированы параметры, схожие по назначению. Значения всех параметров описывать вряд ли целесообразно, т.к. название говорит само за себя, остановлюсь лишь на краткой характеристике и тех параметрах, на которые следует обратить внимание. Первая секция файла называется limits, в ней описываются параметры подключения клиентов, таких как максимальное их число, тайм-аут, после которого клиент отключается, если связь с ним прервалась, размер очереди, и пр. Изменять их стоит только при большом количестве пользователей и плохих каналах (в перегруженных сетях). Следующая секция authentication содержит пароли и пользователей, имеющих доступ к серверу для тех или иных целей. В поле source-password прописывается незашифрованный пароль для source client, имя пользователя, используемое источниками «source», поле relay-password на данный момент не используется, поля admin-user и admin-password содержат имя пользователя и пароль для администрирования сервера.
Далее описываются параметры подключения источников информации (source client). Так, если на компьютере одна сетевая плата, то для работы достаточно в параметре hostname указать имя компьютера (или localhost, если источник находится на том же компьютере), в ином случае директивой bind-address указываем на сетевой интерфейс, параметр port при этом укажет на IP-порт (по умолчанию 8000), который будет открыт для подключения источников. Обратите внимание, что возможно задание нескольких портов директивой listen-socket. Директивами master-server, master-server-port, master-update-interval и master-password устанавливаются параметры master relay сервера, с которого будет получаться весь аудиопоток, транслируемый сервером, если нет такого сервера, то оставляем как есть, т.е. закомментированными. Если нет необходимости в получении всего аудиопотока с мастер-сервера для использования отдельных точек монтирования, используется секция relay, в которой параметры server и port указывают на мастер-сервер, mount и local-mount указывают соответственно на экспортируемую и локальную точку монтирования. При работе с сервером SHOUTcast, для того чтобы передавать и метаданные в опции relay-shoutcast-metadata установите 1. В секциях mount, устанавливаются специфические параметры для точки монтирования, указанной в mount-name. Этими параметрами могут быть имя пользователя и пароль (username и password), которым позволено соединяться, максимальное количество пользователей (max-listeners), необязательный параметр dump-file устанавливает файл, куда будет записываться поток, а в случае если с точкой монтирования что-то произойдет, то клиенты могут быть автоматически переброшены на другую точку, указанную в параметре fallback-mount. В секциях paths и logging указываются файлы и каталоги, необходимые для работы сервера, трогать их не стоит, но проверьте наличие всех каталогов на пути к файлам. Единственно интересным параметром является «alias source», позволяющий создать несколько разных точек монтирования из одной. И в security устанавливаются параметры, позволяющие повысить защищенность системы, так, chroot позволит выполняться Icecast в ограниченной среде и в случае взлома злоумышленник дальше указанного каталога не пойдет, а в changeowner нужно указать имя пользователя и группу, от имени которых будет работать процесс сервера.
Настраиваем источник информации
В принципе можно присоединиться к любому серверу трансляций, прописав параметры в секции relay, и больше ни о чем не беспокоиться. Но будем разбираться, как организовать трансляцию самому.
Список (далеко не полный) совместимых клиентов и проигрывателей для прослушивания потоков можно найти на странице http://www.icecast.org/3rdparty.php.
Родным source-клиентом для Icecast является IceS (http://www.icecast.org/ices.php), недавно появилась версия 2.0, работает только под UNIX (точнее, под Linux, FreeBSD, OpenBSD, Solaris) системами. Среди других, с которыми удалось немного поэкспериментировать, понравился Darkice (http://darkice.sourceforge.net), работающий также только под UNIX, но умеющий поставлять информацию для Iceсast версий 1 и 2 и SHOUTcast или iceplay (http://icecast.linuxpower.org), работающий только с mp2-файлами. Для пользователей Windows пригодится SAM2 (http://www.spacialaudio.com) или ezstream (http://www.icecast.org/ezstream.php), который работает также и в UNIX-системах. Есть утилита, написанная и для Mac OSX – Nicecast (http://www.rogueamoeba.com/nicecast). Как видите, выбирать есть из чего.
Кстати, источник информации не обязательно должен находиться на одном и том же компьютере. Для примера займемся настройкой IceS. На данный момент имеются две версии IceS. Версия 0.3, развитие которой приостановлено, предназначена для создания mp3-потоков, и версия 2.0, умеющая транслировать только OggVorbis, по причине малого спроса поддержка mp3 была убрана. Если есть необходимость работы как с mp3, так и OggVorbis, то возможно использование этих двух программ параллельно.
Другой вариант, взять ezstream, поддерживающий два формата (как понимаете, один источник – одна точка монтирования) и к тому же очень простой в настройках. Для установки, помимо вышеперечисленных библиотек, понадобится libshout 2.0, ссылку на которую найдете на сайте IceCast. Далее устанавливаем библиотеку и IceS обычным образом, никаких особенностей здесь нет. Источником данных для IceS может служить компакт-диск, файлы на жестком диске и любое устройство, с которого можно снять информацию.
Здесь стоит отметить, что почти все source clients позволяют взять информацию со своего стандартного входа, обработать и выдать на стримсервер. Для настройки параметров IceS используется файл в формате XML, образцы которого после установки вы найдете в /usr/local/share/ices. Здесь их два: ices-live.xml содержит базовые настройки для Live-трансляции (микрофон, СD-ROM и пр.), а в ices-playlist.xml вы найдете шаблон, используемый при трансляции из файлов, записанных в плейлист. Отличаются они только разделом input, в котором описывается источник информации. Все описывать тоже не буду, остановлюсь лишь на параметрах, требующих пояснения.
Для запуска в качестве демона устанавливаем back ground в 1.
<background>1</background>
Далее описываются параметры вывода логов, при первоначальной отладке установите consolelog в 1, при этом все ошибки будут выводиться на консоль.
<consolelog>1</consolelog>
Секция stream описывает передаваемый поток.
<stream>
<metadata>
<name> Здесь впишите название потока, оно будет видно в проигрывателе </name>
<genre> Жанр мелодий </genre>
<description> Краткое описание потока </description>
</metadata>
Модуль input задает параметры, откуда брать информацию.
Ниже пример для плейлиста, обратите внимание: режим задается тегом module – playlist.
<input>
<module>playlist</module>
<param name="type">basic</param>
же пример для плейлиста, обратите внимание: режим задается тегом module – playlist.
<param name="file">playlist.txt</param>
Это для статического плейлиста, при динамической генерации списка песен используется конструкция:
<param name="program"></param>
Далее следуют параметры random (перемешивание списка), restart-after-reread (перезапускает программу для пересчитывания списка) и once (при 1 проигрывает список только один раз, и работа заканчивается).
</input>
Для считывания входящей информации, например, с микрофона, или других устройств применяется другая конструкция.
<input>
<module>oss</module>
module может быть также alsa (device обычно plughw:0,0), stdinpcm (при считывании со стандартного входа, секции device не надо) и sun при работе Sun Solaris DSP.
<param name="rate">44100</param>
<param name="channels">2</param>
<param name="device">/dev/dsp</param>
<param name="metadata">1</param>
<param name="metadatafilename">test</param>
</input>
Далее следует большая секция instance, описывающая подключение к стримсерверу. При этом возможно задание нескольких параметров, что позволит отсылать информацию нескольким таким серверам или создавать несколько точек монтирования с разными параметрами на одном сервере.
<instance>
Ниже определяем имя узла, порт и пароль, последний должен совпадать со значением в секциях source-password файла icecast.xml.
<hostname> Здесь пишем адрес или имя, куда отправляем поток </hostname>
<port>8000</port>
<password>passwd</password>
<mount>/example.ogg</mount>
А здесь точка монтирования, которая будет видна пользователям, желающим послушать музыку.
Ниже параметры повторной попытки, если не удается сразу подключиться к серверу.
<reconnectdelay>2</reconnectdelay>
<reconnectattempts>5</reconnectattempts>
Параметр буферизации потока (лучше не трогать).
<maxqueuelength>80</maxqueuelength>
Параметры перекодирования, которые могут понадобиться, например, для уменьшения нагрузки на сеть, должны соответствовать принятым значениям, входным данным и частотам дискретизации, иначе можно попортить качество материала.
<encode>
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<channels>2</channels>
</encode>
</instance>
Вот и все. Теперь собираем файлы в плейлист.
#find /home/sound -name *.ogg > /usr/local/share/ices/playlist.txt
В результате файл должен состоять из списка вида:
/home/sound/Song.ogg
Теперь запускаем IceCast.
# /usr/local/bin/icecast -b -c /usr/local/etc/icecast.xml
Changed groupid to 65534.
Changed userid to 65534.
|
И подаем информацию.
# ices /usr/share/ices/ices-playlist.xml
Теперь, набрав в строке любимого проигрывателя:
http://имя_узла:8000/example.ogg
должны услышать музыку. На эту роль подходят как XMMS и WinAMP, так и консольные ogg123 и mpg123.
И пару слов об ошибках, с которыми удалось столкнуться. Например, при запуске IceCast из-под root программа выдала такую информацию.
# /usr/local/bin/icecast -c /usr/local/etc/icecast.xml
WARNING: You should not run icecast2 as root
Use the changeowner directive in the config file
|
Все просто: в целях безопасности под root сервер не запускается, а директива changeowner в конфигурационном файле по умолчанию закомментирована. Исправьте, только проследите, чтобы такой пользователь и группа в системе были.
Далее возможны ошибки из-за невнимательности, связанные с отсутствием каталогов, прописанных в конфигурационных файлах, например, процесс может создать лог-файл, но попутных каталогов создать не может. Например, при запуске IceS выскочила такая ошибка:
unable to open log /var/log/ices/ices.log |
Если проверить командой:
ls /var/log/ices/
то может выясниться, что такого каталога не существует, создайте его командой:
mkdir /var/log/ices
Если все равно ничего не получается, то загляните в лог-файлы, в них выводится достаточно информации, чтобы разобраться с проблемой. Например, в одном из документов я нашел информацию о том, что вторая версия IceCast все-таки работает с mp3-файлами. Не работает. А в логах это выглядело так.
[2004-06-21 14:48:19] INFO playlist-builtin/playlist_read Currently playing "/usr/share/ices/music/alisa/lodka.мр3"
[2004-06-21 14:48:19] WARN playlist-builtin/playlist_read Corrupt or missing data in file (usr/share/ices/music/alisa/lodka.мр3)
|
А при загрузке OggVorbis-файла все нормально.
[2004-06-21 14:49:11] INFO playlist-builtin/playlist_read Currently playing "/usr/share/ices/rammstein/Sonne.ogg"
[2004-06-21 14:49:11] INFO stream/ices_instance_stream Connected to server: 127.0.0.1:8000/example.ogg
[2004-06-21 14:49:12] DBUG reencode/reencode_page Reinitialising reencoder for new logical stream
[2004-06-21 14:49:12] INFO encode/encode_initialise Encoder initialising in VBR mode: 2 channels, 44100 Hz, nominal 64000
|
Вот и все. Как видите, создать свой сервер трансляции аудиопотоков не так уже и сложно. При внимательности на все про все у вас уйдет от силы час-два.
Успехов.