Допустим, вы совершили подвиг — установили Icecast2 из репозиториев, отредактировали icecast.xml, пробросили порты на роутере и даже не запутались в настройках аутентификации. Сервер запущен, порт 8000 открыт, вы заходите в админку по адресу http://localhost:8000 и видите пустоту. Ни одной точки монтирования, никаких потоков. Это нормально, потому что сам по себе Icecast — это лишь «труба», которая ждет, когда в неё кто-то начнет лить данные. Теперь вам нужен «источник» (Source Client), который будет забирать файлы с диска и гнать их на сервер.
В большинстве старых гайдов советуют ices2. Звучит просто: «установи и запусти». Но на деле это превращается в еще одно техническое испытание, где каждый шаг может стать тупиком. Зайдите на любой форум радиолюбителей — там полно тем "Ices not working", где люди годами разбираются с ошибками.
Шаг 1: Форматная западня и «костыли» для MP3
Первое, что нужно знать об ices2 — он нативно не понимает MP3. Этот софт создавался идеологическими сторонниками открытых форматов в эпоху, когда за патент на MP3 требовали отчислений. Поэтому из коробки он работает только с Ogg Vorbis. Тут у пользователя два пути, и оба — сомнительное удовольствие:
- Тотальная конвертация: Вам придется прогнать всю свою медиатеку через
ffmpegилиsox, чтобы превратить MP3 в Ogg. Для библиотеки в 100 гигабайт это займет сутки. Плюс потеря качества (особенно если пережимать из битрейта в битрейт) и двойной расход места на диске. А если исходники в FLAC — вы либо потеряете в качестве, либо объем вырастет в разы. - Использование «древних» версий: Существует старая ветка ices 0.x (ices-mp3), которая поддерживает MP3. Но приготовьтесь к аду зависимостей: она давно не обновлялась, требует libmp3lame, старые версии libxml2 и glibc. Вам, скорее всего, придется собирать её из исходников, сражаясь с ошибками компилятора в современной системе. А если система 64-битная — веселья добавится из-за несоответствия разрядности библиотек.
И это мы еще не говорим о том, что ices2 не умеет подстраивать битрейт под формат. Вы жестко прописываете качество в конфиге, и если исходный файл другого битрейта — пофиг, будет пережимать «на лету» с потерей качества.
Шаг 2: Создание «карты» плейлиста
В ices нет графического интерфейса. Вы должны вручную создать текстовый файл (например, playlist.txt). Но есть нюанс: ices требует абсолютные пути. Запись вида track1.ogg не сработает. Вам нужно сканировать папку и генерировать список вручную с помощью find или ls:
/home/user/radio/music/rock/track1.ogg /home/user/radio/music/pop/track2.ogg
Если вы добавили новую песню в папку — она не заиграет сама. Нужно заново генерировать файл и перезапускать сервис. Можно, конечно, написать cron-скрипт, который будет раз в час пересобирать плейлист и рестартовать ices, но тогда текущая песня оборвется на полуслове. О плавных переходах тоже забудьте — ices просто «кидает» один файл за другим, создавая микро-паузы тишины между треками, что убивает ощущение «живого» эфира. Нет даже простого fade in/fade out.
Шаг 3: Конфигурационный лабиринт
Теперь нужно создать файл конфигурации для самого ices. Это еще один XML-файл (обычно /etc/ices2/ices.xml), где малейшая опечатка обрывает вещание. В этом XML нужно правильно указать путь до вашего плейлиста, задать имя потока, которое увидят слушатели, и самое важное — вписать пароль источника. Причем это не пароль от админки Icecast, а отдельный пароль, который вы должны были заранее прописать в конфигурации самого Icecast в секции source-password. Если они не совпадут — соединения не будет, и вы будете гадать, что пошло не так. Типичный конфиг выглядит так:
<ices>
<background>1</background>
<logpath>/var/log/ices</logpath>
<logfile>ices.log</logfile>
<loglevel>3</loglevel>
<stream>
<metadata>
<name>Моё Радио</name>
<genre>Various</genre>
<description>Интернет-радио на Icecast</description>
<url>http://myradio.ru</url>
</metadata>
<input>
<module>playlist</module>
<param name="file">/etc/icecast2/playlist.txt</param>
<param name="random">1</param>
<param name="loop">1</param>
<param name="once">0</param>
</input>
<instance>
<hostname>localhost</hostname>
<port>8000</port>
<password>source_password</password>
<mount>/live.ogg</mount>
<yp>0</yp>
<param name="encoding">1</param>
<param name="bitrate">128</param>
<param name="channels">2</param>
<param name="samplerate">44100</param>
</instance>
</stream>
</ices>
Обратите внимание на секцию encoding — это параметры перекодирования на лету. Если ваш файл, скажем, 96kbps моно, а вы указали 128kbps stereo, ices попытается его апскейлить, что приведет к артефактам звука и лишней нагрузке на процессор. И самое смешное — ices даже не проверит, существует ли файл плейлиста. Если вы ошиблись в пути, он просто запустится и будет молча ждать треков, которые никогда не придут.
И даже если вы все сделали правильно, ices может просто "молчать". Логи часто не пишутся или пишутся в системные журналы с непонятными кодами ошибок. Поймать момент, когда из-за лишней точки с запятой или пропущенного закрывающего тега рушится эфир — это целое искусство. А если вы захотите сменить формат вещания с Ogg на MP3 — придется переписывать весь конфиг и искать другой билд ices.
Почему в моем решении DIY Радио всё иначе?
Я не заставляю вас выбирать между «неудобным новым» и «глючным старым». В моем приложении на Python нет разделения на «сервер» и «источник» — это единый механизм. Вам не нужно править два разных XML, сверять пароли в разных файлах и генерировать плейлисты консольными командами. Все настройки — через веб-интерфейс или простой YAML-файл, где нельзя ошибиться в синтаксисе.