Блог о жизни и технологиях

Онлайн-радио на Liquidsoap и Icecast

На одном из эфиров на Iriscot Radio меня попросили рассказать о том, как сделать своё собственное онлайн-радио. Что ж, я и расскажу и покажу, как это делается.

Что понадобится?

На хосте:

  1. Браузер
  2. SSH-клиент
  3. FTP-клиент
  4. Текстовый редактор

На сервере (подойдет любой Linux-сервер)

  1. FTP-доступ (я использую vsftpd. Мануал по настройке есть на сайте Ubuntu)
  2. Права администратора

Итак, для начала немного теории. Сердцем онлайн-радио является Liquidsoap (a.k.a. «жидкое мыло»). Именно эта программа читает аудио-файлы, формирует из них поток и выдаёт в эфир. Icecast, в свою очередь, дополнительная прослойка, позволяющая смотреть статистику по потокам и блокировать слушателей. Мы рассмотрим конфигурации как с использованием Icecast, так и без него.

Приступим к настройке сервера.
Установим нужные пакеты:

sudo apt install liquidsoap icecast2

Нам предложат настроить пароли для Icecast. Отвечаем утвердительно и решительно.

Имя узла: оставляем localhost;
Пароль к источникам: ставим любой и запоминаем. Я поставил «pwned»;
Пароль к релею: ставим любой, запоминать необязательно;
Административный пароль: ставим удобный для себя пароль, чтобы заходить в веб-интерфейс.

Теперь надо подготовить папку для радио. Я создал папку «onlineradio» в домашней директории. Вы можете выбрать для неё любое место. Внутри папки также создана папка «music» для хранения музыки, которую мы будем крутить на радио. Эта папка может быть отдельно от радио, я создал всё в одном месте для удобства. Сразу загружаем туда нужную нам музыку.

Настало время конфига. Создаем файл «radio.conf» (имя может быть любым) и начинаем заполнять.

Логгирование

Если хотите, можете не добавлять эту часть кода.

set("log.stdout", true)  # вывод в консоль 
set("log.level", 3)  # уровень логгирования - 3
set("log.file.path","radio.log")  # дополнительно вывод в файл

Кодировка

Устанавливаем кодировку тегов в UTF-8, чтобы избежать кракозябр.

set("tag.encodings",["UTF-8"])

Первоначальный поток

music = mksafe(audio_to_stereo(playlist(reload=1, reload_mode="rounds", mode="randomize", "./music/")))

Разложим по полочкам всё вышенаписанное.
playlist() — создаёт плейлист с музыкой из папки music, находящейся в одной папке с конфигом. reload_mode=«rounds» — обеспечивает равномерность треков при рандоме. mode=«randomize» — собственно, сам рандом (normal — по порядку). reload=1 — перезагружает плейлист каждую секунду;
audio_to_stereo() — конвертирует полученный поток в формат стерео;
mksafe() — делает поток infaillible, добавляя тишину, когда ничего не играет.

Кстати, пару слов о видах потоках. В Liquidsoap их два:
faillible — когда поток может оборваться в любой момент. Например, если это поток из студии во время прямого эфира — ведущий может в любой момент отключиться от эфира;
infaillible — когда поток не обрывается. Как в примере выше, это может быть проигрывание локальных ресурсов.

У нас получился поток music. Дальше мы можем работать с ним — навешивать дополнительные примочки или выводить в эфир.

Делаем приятно ушам

Мне очень нравится перекрестное затухание, я использую его даже в аудиоплеерах. Добавим его и на радио.

music = crossfade(start_next=2.,fade_out=3.,fade_in=1.,music)

start_next — длительность эффекта;
fade_out, fade_in — длительности затухания заканчивающегося и следующего треков соответственно.

ON AIR!

Как уже писалось, решить проблему вывода потока в эфир можно двумя способами. Рассмотрим простейший способ без Icecast, с использованием harbour.

output.harbor(%mp3.vbr,
port = 1337, encoding = "UTF-8",
mount = "radio-live", music)

%mp3.vbr — задаем кодирование в MP3 с переменным битрейтом;
port — можете выбрать любой;
encoding — как обычно, только UTF-8;
mount — точка монтирования. По сути являет собой путь на сервере, по которому будет доступен поток;
music — поток для вывода.

Запускаем сервер

cd ~/onlineradio
liquidsoap /path/to/radio.conf

Укажите свой путь к конфигу. В консоли вы увидите детали работы сервера, в частности наглядную смену треков.

Готово! Открываем в браузере адрес http://[адрес сервера]:[порт]/[точка монтирования] и слушаем результат.

Казалось бы, на этом можно остановиться, но мы-то заслуживаем большего...

Настройка Icecast

Внесем некоторые изменения в конфигурационный файл /etc/icecast2/icecast.xml.

sudo nano /etc/icecast2/icecast.xml

В самом начале можете прописать справочную информацию о сервере — место нахождения и почта админа:

<location>Earth</location>
    <admin>icemaster@localhost</admin>

В разделе <authentication> можно поменять пароли, или подсмотреть их, если забыли.

И, самое главное здесь — <port> в <listen-socket>. Это порт, на котором будет работать Icecast. Пропишем там тоже 1337 для аутентичности.

Сохраняем и выходим из редактора. Чтобы изменения конфига вступили в силу, нужен перезапуск Icecast:

sudo service icecast2 restart

Теперь поменяем в основном конфиге (radio.conf) вывод на Icecast. Удаляем последнюю секцию, связанную с harbour и вместо неё пишем:

output.icecast(%mp3.vbr,
description="Iriscot Radio",
genre="Вичуха",
url="https://radio.iriscot.org/",
host="localhost", port=1337, password="pwned",
mount="radio-live", music)

Как видите, здесь уже больше простора: можно указать описание потока, жанры музыки, и ссылку на страницу, где можно послушать это всё. host — это адрес, на котором крутится Icecast. В данном случае он у нас на той же машине, что и жидкое мыло. port — то, что мы прописывали выше, password — пароль к источникам. Все остальное идентично harbor’у.

Запускаем радио, открываем в браузере тот же адрес, что и раньше. Играет? Отлично, но это не всё. В соседней вкладке открываем этот же адрес, но без точки монтирования (корневой) и сразу же попадаем в веб-интерфейс:

Здесь можно посмотреть, что сейчас играет на сервере и сколько людей его слушают. В разделе Administration (логин — admin, пароль — указали на этапе установки) можно посмотреть более детальную информацию о сервере, посмотреть список слушателей, переместить их, забанить, а также отключить источник. Штука довольно удобная и в основном используется как API для получения текущего трека средствами того же PHP, например.

Более удобный запуск радио

liquidsoap /path/to/radio.conf >> /dev/null &

Эта команда запускает радио в фоновом режиме, а все сообщения выводятся в мусорку /dev/null. В терминал при этом выведется номер процесса. Такую строку можно также вставить в скрипт автозагрузки.

Чтобы завершить процесс радио сначала ищем номер процесса (или вспоминаем число, которое нам дали при запуске):

ps aux | grep liquidsoap

Затем завершаем его:

kill [номер]

Что дальше?

У нас есть рабочее радио, можно теперь его красиво оформить, сверстав веб-плеер, провести рекламную кампанию и всё, вы успешны.