Своё интернет-радио с Icecast 1
Программное обеспечение
Статья была опубликована 1 апреля 2013 года в 12:00, а последний раз правилась 10 февраля 2020 года в 03:31.
Постоянная ссылка: http://www.nixp.ru/articles/101.html
Описание конфигурации сервера для интернет-вещания радио с помощью свободного решения Icecast и клиента-источника IceS.
Примечание: эта статья была впервые опубликована в электронном издании «Open Source» от журнала «Системный администратор» и размещена на nixp.ru по согласованию с редакцией.
Предисловие
Время от времени у меня возникала мысль сделать свой домашний сервер. Однако отсутствие знаний по этому вопросу и лень гасили мысль на корню, как сильный ветер разбрасывает красные угли догорающего костра… Несмотря на эту лирику, в конце прошлого года я созрел и собрал такой сервер. Получилось относительно дешево и сердито: материнская плата со встроенным процессором AMD E450 и покамест 4 Гб RAM. Мне этого хватает: адронный коллайдер не запускаю.
Освоив решение типовых задач администратора (Apache, различные веб-движки и т.п.), я решил пойти дальше. Возникло желание транслировать в сеть свою музыку…
Знакомство с Icecast
Мой выбор пал на сервер потокового звука Icecast (www.icecast.org). У него есть конкурент — проприетарный SHOUTCast, разработанный в Nullsoft и ныне принадлежащий AOL. Судя по всему, разработка Icecast началась на год раньше, чем SHOUTCast. При этом Icecast «вещает» потоки Vorbis и Theora по протоколу HTTP, а MP3, AAC и NSV — по протоколу SHOUTcast. Для прослушивания интернет-радио пользователю нужен мультимедийный проигрыватель, поддерживающий его, — например, VLC, Mplayer, Audacious или Winamp. Пользователь получает от вас (т.е. от сайта, где вы разместите ссылку, или из особого каталога каналов интернет-радио) список песен в формате M3U, но этот список не совсем обычный: загружая его в свой плеер, пользователь будет слышать то, что транслируется вашим сервером в настоящий момент.
А как это выглядит с серверной стороны? Здесь требуется связка из непосредственно сервера Icecast и так называемого клиента-источника (source client). Последний поставляет для Icecast звуковой поток. Клиентом может быть как программа, считывающая звук с микрофона, так и проигрыватель вроде mpd (или даже Winamp с особым плагином).
В статье я рассмотрю простейший пример, как добиться трансляции в сеть песен из списка на сервере. В качестве клиента-источника выбран IceS (http://www.icecast.org/ices.php), поскольку его быстрее всего настроить. Обычно в дистрибутивах так и делают сборку пакетов: Icecast и к нему в довесок IceS. IceS умеет воспроизводить звук со входа звуковой карты, а также файлы Ogg Vorbis. IceS старой версии поддерживал еще и MP3, но теперь перестал, по идеологическим причинам.
Настройка: Icecast
Перед непосредственной настройкой обращу внимание на один нюанс в сетевой конфигурации. Как и любой сервер, Icecast «слушает» запросы, поступающие в определенный порт (порт по умолчанию для Icecast — 8000). Если ваш «железный» сервер работает за [домашним] роутером и у вас несколько компьютеров (сервер является лишь одним из них), то надо «объяснить» роутеру, на какой из компьютеров передавать запросы, поступающие на порт 8000. Это называется пробросом портов, и в разных роутерах настраивается по-разному. В моем TP Link он задается в разделе Forwarding -> Virtual Servers, а в роутерах D-Link эти настройки ищите в Advanced -> Port Forwarding. Собственно, в них необходимо поставить в соответствие порту 8000 внутренний IP-адрес вашего серверного компьютера (например, 192.168.0.100). Если же IP-адреса ваших домашних машин «скачут» (раздаются через DHCP), их можно жестко «забить» в соответствующих настройках роутера DHCP (обычно это называется «Address Reservation»), привязав MAC-адреса к внутрисетевым IP. В общем, надо сделать так, чтобы внутренний IP-адрес сервера не менялся, и на этот адрес сделать проброс порта 8000.
Теперь о настройке Icecast и IceS. Сами приложения есть в репозитории любого популярного Linux-дистрибутива, BSD-системы и т.п. Существует и версия Icecast под Windows. Сборка из исходников также не составит труда: никаких экзотических зависимостей нет. И сервер, и клиент-источник управляются через конфигурационные файлы в формате XML, которые надо указать в командной строке при запуске Icecast и IceS. При установке из пакетов эти конфиги обычно помещаются в /etc, а при установке из исходника — где вы сами укажете. И в «пакетном» варианте, и в исходниках, в составе Icecast и IceS идет набор конфигов-примеров, которые можно (и даже нужно) брать в качестве основы для своего конфига.
Примечание: в интернет-статьях на эту тему существует некоторая путаница. Причем она есть даже в документации к Icecast и IceS, поскольку документация зачастую не успевает за развитием исходников, и часть параметров в конфигах уже не работает, а часть называется иначе. Это служит причиной тому, что «готовые» рецепты иногда не срабатывают. Я, например, по чужим статьям так и не разобрался, поэтому пошел путем чтения документации и исходников.
Поскольку файлы конфигурации могут иметь произвольные названия, далее в статье буду использовать icecast.xml в качестве имени файла с настройками Icecast, а ices.xml — для Ices. Соответственно, команды запуска служб будут выглядеть примерно так (требуются права root):
# icecast -c icecast.xml # ices ices.xml
Начнем с Icecast. После его успешного запуска вы сможете зайти в веб-браузере на страницу http://localhost:8000/ (или http://ваш_домен:8000/, чтобы проверить, что сервер видно извне).
Чтобы не загромождать статью «лишним» содержимым icecast.xml, приведу только фрагменты с важными (изменёнными) параметрами — остальные значения останутся по умолчанию. В случае сборки из исходника готовый к правке шаблон файла настроек можно найти в каталоге conf (icecast.xml.in), а при установке из пакета можно сразу редактировать /etc/icecast.xml (другие шаблоны будут находиться в /usr/share/icecast/doc/). Впрочем, в некоторых дистрибутивах Linux пути могут отличаться.
Конфиг представляет собой обычный XML, включающий в себя вложенные блоки настроек. Здесь действует привычное правило, что более точные настройки (т.е. с большим вложенным уровнем) имеют приоритет. Это позволяет определять глобальные настройки и одновременно задавать «локальные» правила для отдельных случаев.
Параметры вроде webroot, adminroot я не трогал. Они понадобятся, если вы захотите изменить веб-интерфейс Icecaset по умолчанию и подобные вещи. То же самое относится к разделу paths в целом: здесь можно ничего не трогать, если вам это осознанно не нужно. За пароли отвечают параметры раздела authentication:
- source-password — пароль, с которым к серверу подключается клиент-источник;
- relay-password — пароль для общения с другим Icecast-сервером. Relay означает «ретрансляция», т.е. вы можете ретранслировать чужой сервер своим;
- admin-user, admin-password — логин и пароль для администрирования сервера. Запрашивается при получении доступа к странице администрации при заходе на веб-интерфейс сервера. Веб-интерфейс имеет несколько разделов, как доступных всем пользователям, так и только для администраторов.
Другие важные параметры:
- hostname — доменное имя либо IP-адрес вашего сервера;
- admin — строка, которая будет видна в веб-интерфейсе. Описание администратора сервера — можно указать имя, e-mail и т.п.
А следующая ниже конструкция определяет, по какому порту идут запросы:
<listen-socket> <port>8000</port> </listen-socket>
Кому-то может понадобиться избавление от комментария с такого раздела:
<directory> <yp-url-timeout>15</yp-url-timeout> <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url> </directory>
YP означает «желтые страницы» (Yellow Pages). Если этот раздел представлен (и не закомментирован), то ваша радиостанция с динамически обновляемыми сведениями о воспроизводимых песнях будет автоматически попадать в публичный каталог Icecast-радиостанций на http://dir.xiph.org/index.php.
Вот и всё, для базовой настройки больше ничего настраивать не потребуется (конечно, если вы используете файл-шаблон, где всё остальное уже прописано). Запуск сервера:
# icecast -c путь_к_icecast.xml
Самое время зайти на него из веб-браузера: напомню, что из сети это можно сделать переходом по адресу http://вашдомен:8000/. Если всё в порядке, то откроется веб-интерфейс, от которого покамест мало проку — разве что можно убедиться в работоспособности сервера, который еще ничего не транслирует.
Настройка: IceS
Теперь надо настроить клиент-источник — IceS. Для начала создадим файл M3U со списком песен. Это будет просто текстовый файл с полными именами файлов. В его создании поможет команда:
$ find $(pwd) -name \*.ogg > playlist.m3u
В ней результаты поиска (всех файлов текущего каталога с расширением .ogg) запишутся в playlist.m3u, который будет использоваться в IceS.
Можно редактировать файл настроек Ices (ices.xml). В нем есть основная секция stream, где параметр Reencode лучше установить в 0 — иначе Ices будет пытаться перекодировать всю музыку в другие параметры сжатия. Он также будет пытаться сделать это, если не закомментировать весь раздел encode. Лучше сразу пресечь это, чтобы потом не удивляться, почему так загружается процессор в top.
Чтобы поток попал в каталог YP, на уровне раздела stream добавляем:
<public>1</public>
Там же надо прописать раздел metadata. Хотя в документации сказано, что он пока не используется, исходники шагнули вперед: данные из metadata передаются в Yellow Pages и отображаются там. Раздел будет выглядеть так:
<metadata> <name>Название вашей радиостанции</name> <genre>жанры, разделенные запятыми</genre> <description>Описание радиостанции</description> <url>адрес сайта, если он есть</url> </metadata>
Теперь подключим список песен:
<input> <module>playlist</module> <param name="type">basic</param> <param name="file">полный путь к вашему m3u-файлу</param> <param name="random">0</param> <param name="restart-after-reread">0</param> <param name="once">0</param> </input>
Несколько комментариев:
- random = 0 — воспроизводить все песни последовательно (значение 1 активирует случайный порядок);
- once = 0 — после окончания воспроизведения всех песен начать всё с начала списка.
Плейлист готов. Пропишем параметры подключения к Ices, в разделе instance.
<instance> <hostname>доменное имя или IP, которое вы прописали в hostname в настройках Icecast</hostname> <port>8000</port> <password>пароль клиентского доступа, прописанный в настройках Icecast (по умолчанию hackme)</password> <mount>/music.ogg</mount> <public>1</public> <yp>1</yp> </instance>
И здесь public выставлен в 1, что называется, «для верности». Для меня осталось тайной, в каких версиях Ices эти параметры дублируют друг друга, а в каких — устарели. Возможно, public на уровне stream и не нужен, если включен на уровне instance.
Важный параметр mount задает название точки подключения (монтирования) для потока. Поток будет связан с этой точкой подключения. Может быть несколько потоков — несколько точек подключения. Воспринимайте потоки как каналы. У вас может быть несколько каналов (например, по одному вы включаете только рок-музыку, а по другому — рэп), и в рамках потока описываете точку подключения. В примере указана единственная точка монтирования (/music.ogg): она участвует в формировании адреса ссылки для M3U-файла, который генерируется сервером и предоставляется пользователю для скачивания. Ссылка будет иметь такой вид: http://ваш-домен:8000/music.ogg.m3u.
На этом настройка завершена. Запускаем Ices:
# ices ices.xml
И заходим на веб-страницу радиостанции. На ней должен появиться ваш поток, т.е. будет указана точка подключения и статистика по ней. Из веб-интерфейса можно скачать ссылку на «транслируемый» M3U и разместить его на своих сайтах. Поздравляю, у вас появился свой Icecast-сервер.
Послесловие
Кстати, в сети существуют коммерческие и некоммерческие хостинги с услугами Icecast. Создать свой бесплатный канал можно, например, на сайте http://giss.tv. Но ведь завести собственный сервер намного интереснее, не так ли?..
-
Популярные в этом разделе:
- «Обзор системы фильтрации спама rspamd: возможности, конфигурация, работа»,
- «Защищаем себя средствами GnuPG»,
- «Своё интернет-радио с Icecast».
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1