Как создать своё интернет-радио

Как создать своё интернет-радио

С автодиджеем, прямыми трансляциями и доступом с любого аудиопроигрывателя
6 минут40271

Привет, я Антон Чигарёв, системный администратор. В этом посте я расскажу, как создать свою радиостанцию и вещать через интернет. Вы сможете организовать офисное, студенческое или просто частное радио, доступное по всему миру — в любом медиапроигрывателе. Статья рассчитана на новичков, которым нужно доходчивое руководство с нуля.

Небольшая предыстория. У меня есть проект Blind.games, посвящённый компьютерным играм для слепых людей. Это не только сайт, но и голосовой портал на базе TeamTalk, где собирается сообщество. Я, как и многие пользователи моего проекта, тотально слепой, но это не мешает мне интересоваться музыкой и системным администрированием. Периодически мы стримим игры, рассказываем о настройке программ, проводим встречи с интересными людьми. И нам нужно было своё радио, чтобы по расписанию транслировать записи передач, а в остальное время — музыку в случайном порядке, но без повторов. Так я получил опыт, которым сейчас хочу поделиться.

В этой статье я решил систематизировать и доступно изложить информацию, которую собрал из множества источников, проверил на практике и немного дополнил. Рассмотрим весь процесс создания радио: от первых шагов до прослушивания результата.

Что нужно для старта

Всё, что нам понадобится, — это сервер под управлением Debian 9 и две бесплатные программы:

  • Icecast — с её помощью организуем вещание, будем управлять аккаунтами диджеев и настройками;
  • Liquidsoap — автоматический диджей, который заполнит свободную часть эфира записями из нашей базы. Он будет играть по расписанию или случайным образом.

Грабли, которые мы обойдём

Когда хочешь чередовать живое и автоматическое вещание, сведений из документации вдруг оказывается маловато. Например, сначала я не понимал, как запланировать регулярный выход передачи по определённым дням недели — допустим, по вторникам.

Потребовалось время, чтобы разобраться, как работают компрессоры и эквалайзеры. Думаю, этой теме можно посвятить отдельный пост.

Сначала я не знал, что Liquidsoap поддерживает работу с переменными. Примеры кода вы не раз увидите ниже.

Но главная проблема, которая никак не хотела решаться, — это невозможность автоматически выключить музыку с началом запланированной передачи. По умолчанию музыка становилась тише, но продолжала играть. Решение мне позже подсказал знакомый, а я пишу уже с учётом того, чтобы подобной ситуации не возникло.

Выбираем сервер

Не буду рекламировать хостинг-провайдеров, но хочу обратить ваше внимание на параметры, важные для работы интернет-радио.

  • Поддержка аппаратной виртуализации. Советую брать сервер с KVM, потому что при контейнерной виртуализации (на Open VZ) могут возникать проблемы с Liquidsoap. Я с этим сталкивался.
  • Дисковое пространство. Его должно быть достаточно, чтобы помимо ОС и софта уместить вашу музыкальную коллекцию, из которой автодиджей будет брать записи. Чтобы звук оставался качественным, записи лучше не сжимать.
  • Оперативная память и процессор. Если вы планируете изредка вещать вживую, а остальное поручить программе, для стабильной работы понадобятся минимум 2 ГБ оперативки и двухъядерный процессор. Обычно Liquidsoap и Icecast не жадны до ресурсов, но когда надо запустить несколько станций или потоков с разным битрейтом, стоит брать сервер помощнее.

Готовимся к работе

Если вы только приобрели сервер и ещё не настроили Debian, нужно убедиться, что система дружит с кириллицей. Мы ведь хотим, чтобы русские названия композиций отображались корректно. 

Подключаемся к серверу и быстренько наводим порядок. Для начала устанавливаем обновления. В терминале пишем: 

apt-get update
apt dist-upgrade

Дальше смотрим доступные в системе локали: 

locale -a

Получаем что-то вроде этого: 

C
C.UTF-8
en_US.utf8
POSIX
ru_RU.utf8

Это значит, что система локализована. Если у вас нет, можете перенастроить локаль командой: 

dpkg-reconfigure locales

Дальше, чтобы включить поддержку кириллицы, выберите ru_RU.UTF-8.

И тот же вариант задайте по умолчанию.

Сервер настроен!

Устанавливаем софт

Начнём с Icecast:

apt-get install icecast2

Вас спросят, хотите ли вы сконфигурировать программу. Отвечайте как угодно — окно с настройками всё равно не появится. По крайней мере, я ни разу не дождался его в Debian 9. Но это не критично.

Переходим к следующему шагу — обеспечиваем программе автозапуск. Для этого в любом текстовом редакторе (я использую nano) открываем файл:

nano /etc/default/icecast2

Это именно файл, просто разрешение не указано. 

В самом конце находим параметр ENABLE. Важно, чтобы он имел значение true. Если видите false — меняйте. Дальше сохраняем файл нажатием CTRL+O и выходим из редактора (CTRL+X).

Настраиваем Icecast

Если у вас, как и у меня, не было возможности сконфигурировать программу в процессе установки, пора лезть в настройки. Все они хранятся в файле icecast.xml в директории /etc/icecast2/.

Многие параметры в этом файле прокомментированы — расскажу лишь о тех, без которых не обойтись на старте. За подробностями не грех заглянуть в официальную документацию, а если у вас появятся вопросы, я готов детально разобрать функции Icecast в отдельной статье. 

Сначала проверим максимально допустимое число одновременно подключённых слушателей:

<clients>100</clients>

По умолчанию — сто, но ориентируйтесь на ширину канала вашего сервера.

В блоке authentication меняем все данные на свои. Параметру bind-address в качестве значения присваиваем IP-адрес нашего сервера. 

Теперь внимательно смотрим на блок mount. Здесь мы пропишем точки монтирования для источников вещания. Это важный момент, без которого не смогут выйти в эфир наши диджеи, в том числе и AutoDJ.

В коде ниже я создаю несколько точек монтирования с индивидуальными параметрами:

<mount>
 <mount-name>/autodj</mount-name> 
 <password>ваш_пароль</password> 
 <max-listeners>500</max-listeners> 
 <max-listener-duration>3600</max-listener-duration> 
 <dump-file>/tmp/dump-live.mp3</dump-file> 
 <intro></intro> 
 <charset>ISO8859-1</charset> 
 <public>1</public> 
 <stream-name>BestRadio</stream-name> 
 <stream-description>Лучшее радио галактики.</stream-description> 
 <stream-url>http://Ваш.IP:8000/autodj.mp3.m3u</stream-url> 
 <genre>Other</genre> 
 <bitrate>128</bitrate> 
 <type>application/mp3</type> 
 <subtype>mp3</subtype> 
 <burst-size>65536</burst-size> 
 <mp3-metadata-interval>4096</mp3-metadata-interval> 
</mount> 
<mount> 
 <mount-name>/live</mount-name> 
 <password>ваш_пароль</password> 
 <max-listeners>500</max-listeners> 
 <max-listener-duration>3600</max-listener-duration> 
 <dump-file>/tmp/dump-live.mp3</dump-file> 
 <intro></intro> 
 <fallback-mount>/autodj</fallback-mount> 
 <fallback-override>1</fallback-override> 
 <fallback-when-full>1</fallback-when-full> 
 <charset>ISO8859-1</charset> 
 <public>1</public> 
 <stream-name>MyRadio</stream-name> 
 <stream-description>Прямая трансляция.</stream-description> 
 <stream-url>http://Ваш.IP:8000/autodj.mp3.m3u</stream-url> 
 <genre>Other</genre> 
 <bitrate>128</bitrate> 
 <type>application/mp3</type> 
 <subtype>mp3</subtype> 
 <burst-size>65536</burst-size> 
 <mp3-metadata-interval>4096</mp3-metadata-interval> 
</mount>

Как вы могли догадаться, точка autodj подключена, когда в эфире никого нет. Если в это время кто-нибудь у себя в проигрывателе откроет ссылку типа http://ваш-ip:8000/live, он услышит автоматическое вещание. Но стоит вам выйти в эфир с точки live — autodj отключится.

Если вы хотите ограничить доступ к настройкам Icecast, обратите внимание на блок changeowner. Здесь вы можете указать имя и группу пользователя, который вправе менять конфигурацию.

Осталось сохранить результат. С Icecast для первого раза достаточно. Теперь давайте позаботимся об автоматическом диджее.

AutoDJ

Устанавливаем Liquidsoap из репозитория Debian — это легко, проблем возникнуть не должно:

apt-get install liquidsoap

Теперь создадим каталоги для хранения музыки, заставок (джинглов) и передач. У себя я завёл папку Content, а в ней предусмотрел следующие субдиректории:

  • Music — сюда я скидываю все музыкальные треки;
  • Programs — здесь лежат записи передач;
  • Jingles — папка с «рекламными» объявлениями, которых у нас от силы штук пять, чисто для ознакомительных целей;
  • Jokes — сюда гружу отрывки из разных стендапов для проигрывания в определённое время.

Давайте реализуем это в терминале:

mkdir /home/Content/Jingles
mkdir /home/Content/Programs
mkdir /home/Content/Music

Чтобы ускорить и упростить заливку файлов, можете настроить FTP, но это отдельная тема. А пока займёмся настройками программы.

Конфигурационные файлы имеют расширение .liq и хранятся в директории /etc/liquidsoap. Для вашего удобства там лежит пример — файлик radio.liq.example. Его можно редактировать прямо на сервере или загрузить на свой компьютер. 

Пересохраняем файл с любым новым именем, допустим, my-dj.liq. Вот как может выглядеть содержимое:

#!/usr/bin/liquidsoap -d
#set("init.daemon",true)
#set("init.daemon.pidfile",false)
set("log.file",false)

Чтобы вести лог работы программы, раскомментируйте эти строки:

#set("log.file.path","/var/log/liquidsoap/basic.log")
#set("log.stdout",true)
#set("log.level",4)

Блок ниже — для тех, кому нужен telnet.

#set("server.telnet.bind_addr","127.0.0.1")
#set("server.telnet",true)
#set("server.telnet.port",1234)

Я включаю поддержку OGG и MP3. OGG удобен, когда места мало, а качество некритично.

set("decoder.file_decoders",["META","MAD","OGG"])
set("decoder.file_extensions.mad",["mp3","mp2","mp1"])
set("decoder.file_extensions.ogg",["ogv","oga","ogx","ogg","opus"])
set("decoder.mime_types.ogg",["application/ogg","application/x-ogg","audio/x-ogg","audio/ogg","video/ogg"])
set("decoder.mime_types.mp3",["audio/mpeg","audio/MPA"])

Настраиваем отображение данных о записи: берём инфу из метатегов.

def update_title(m) =
 title = m["title"]
 if title == "" or title == "Unknown" then
  content = m["filename"]
  content = basename(content)
  content = get_process_output("STR=\""^content^"\"; echo ${STR%.*}")
  content = string.recode(out_enc="UTF-8", content)
  [("title", content)]
 else
  sArtist = string.recode(out_enc="UTF-8", m["artist"])
  sTitle = string.recode(out_enc="UTF-8", m["title"])
  [("title", sTitle),
  ("artist", sArtist)]
 end
end
set("tag.encodings",["UTF-8"])

Указываем путь до папки с музыкой и параметры воспроизведения.

music = nrj(playlist(mode='randomize', reload_mode='rounds=1', '/home/Content/Music'))

Когда все треки отыграют, рандомайзер перемешает их и снова запустит. Теперь укажем путь к джинглам.

jingle = mksafe(playlist("/home/Content/Jingles"))

Чтобы проигрывать записи по расписанию, свяжем их с переменными. Можно использовать одно и то же имя файла для контента одного типа. Например, когда я хочу добавить в расписание аудиокнигу, я загружаю файл в папку Programs и переименовываю его в book.mp3. 

book = single("/home/Content/Programs/book.mp3")
jokes = single("/home/Content/Programs/jokes.mp3")
repeat = single("/home/Content/Programs/archive_recording.mp3")

Дальше укажем, с какими интервалами играть заставки. Например, я ставлю один джингл на каждые пять треков.

radio = rotate(weights = [1, 5],[jingle, music])
radio = crossfade(fade_out = 2.0, fade_in = 1.0, start_next = 0.5, radio)
radio = mksafe(radio)
radio = map_metadata(update_title, radio)
default = fallback(track_sensitive=false,[

Настроим программу передач. Тематические блоки разделим запятыми. В понедельник поставим книгу (путь к файлу уже привязан). Во вторник — шутки. В воскресенье — повтор ранее записанной передачи.

switch([
({1w13h00m00s}, book),
({2w15h00m00s}, jokes),
({7w18h00m00s}, archive_recording)
#Xw — это день недели, где 1 — понедельник. 
#Xh — час, Xm — минуты, Xs — секунды.
]),
radio
])
output.icecast(%mp3(bitrate=128, samplerate=44100, stereo=true),

Внесём данные, уже прописанные в конфигурации Icecast.

mount = "autodj",
encoding = "ISO-8859-1",
default,
host = "ваш_домен", port = 8000, password = "ваш_пароль",
genre="other",
name="My radio",
fallible = true,
icy_metadata="true",
public=true,
url="http://ваш-url",
description="Вы слушаете BestRadio.")

Всё сохраняем. Ура! Мы готовы тестировать радио. 

Любуемся результатами

Запускаем сначала Icecast: 

/etc/init.d/icecast2 start

Теперь Liquidsoap: 

service liquidsoap start

Создаём у себя на компьютере текстовый файл и вносим туда строку вида: 

http://ваш-ip:8000/autodj

Сохраняем файл с расширением .m3u и открываем его в аудиопроигрывателе. Если в папке Music лежат треки, радио должно играть.

На этом пока всё. Надеюсь, материал был вам полезен. Если хотите, чтобы я раскрыл какие-то темы подробнее, оставьте комментарий. А пока — успеха в запуске вашего радио!

Хотите свободно работать с Debian и другими дистрибутивами Linux? Приходите учиться на профессию «системный администратор», и через 9 месяцев вы не только освоите Linux, но и сможете обеспечивать бесперебойную работу компьютерной техники и ПО в любой организации!

программированиеsys_admin
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!
Posts popup