В статье рассказывается:
- Что нужно для старта
- Грабли, которые мы обойдём
- Выбираем сервер
- Готовимся к работе
- Устанавливаем софт
- Настраиваем Icecast
- AutoDJ
- Любуемся результатами
-
Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.Бесплатно от Geekbrains
Привет, я Антон Чигарёв, системный администратор. В этом посте я расскажу, как создать свою радиостанцию и вещать через интернет. Вы сможете организовать офисное, студенческое или просто частное радио, доступное по всему миру — в любом медиапроигрывателе. Статья рассчитана на новичков, которым нужно доходчивое руководство с нуля.
Небольшая предыстория. У меня есть проект Blind.games, посвящённый компьютерным играм для слепых людей. Это не только сайт, но и голосовой портал на базе TeamTalk, где собирается сообщество. Я, как и многие пользователи моего проекта, тотально слепой, но это не мешает мне интересоваться музыкой и системным администрированием. Периодически мы стримим игры, рассказываем о настройке программ, проводим встречи с интересными людьми. И нам нужно было своё радио, чтобы по расписанию транслировать записи передач, а в остальное время — музыку в случайном порядке, но без повторов. Так я получил опыт, которым сейчас хочу поделиться.
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Скачивайте и используйте уже сегодня:
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка
Только проверенные нейросети с доступом из России и свободным использованием
ТОП-100 площадок для поиска работы от GeekBrains
Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽
В этой статье я решил систематизировать и доступно изложить информацию, которую собрал из множества источников, проверил на практике и немного дополнил. Рассмотрим весь процесс создания радио: от первых шагов до прослушивания результата.
Что нужно для старта
Всё, что нам понадобится, — это сервер под управлением Debian 9 и две бесплатные программы:
- Icecast — с её помощью организуем вещание, будем управлять аккаунтами диджеев и настройками;
- Liquidsoap — автоматический диджей, который заполнит свободную часть эфира записями из нашей базы. Он будет играть по расписанию или случайным образом.
Грабли, которые мы обойдём
Когда хочешь чередовать живое и автоматическое вещание, сведений из документации вдруг оказывается маловато. Например, сначала я не понимал, как запланировать регулярный выход передачи по определённым дням недели — допустим, по вторникам.
Потребовалось время, чтобы разобраться, как работают компрессоры и эквалайзеры. Думаю, этой теме можно посвятить отдельный пост.
Сначала я не знал, что Liquidsoap поддерживает работу с переменными. Примеры кода вы не раз увидите ниже.
Скачать файлНо главная проблема, которая никак не хотела решаться, — это невозможность автоматически выключить музыку с началом запланированной передачи. По умолчанию музыка становилась тише, но продолжала играть. Решение мне позже подсказал знакомый, а я пишу уже с учётом того, чтобы подобной ситуации не возникло.
Выбираем сервер
Не буду рекламировать хостинг-провайдеров, но хочу обратить ваше внимание на параметры, важные для работы интернет-радио.
- Поддержка аппаратной виртуализации. Советую брать сервер с KVM, потому что при контейнерной виртуализации (на Open VZ) могут возникать проблемы с Liquidsoap. Я с этим сталкивался.
- Дисковое пространство. Его должно быть достаточно, чтобы помимо ОС и софта уместить вашу музыкальную коллекцию, из которой автодиджей будет брать записи. Чтобы звук оставался качественным, записи лучше не сжимать.
- Оперативная память и процессор. Если вы планируете изредка вещать вживую, а остальное поручить программе, для стабильной работы понадобятся минимум 2 ГБ оперативки и двухъядерный процессор. Обычно Liquidsoap и Icecast не жадны до ресурсов, но когда надо запустить несколько станций или потоков с разным битрейтом, стоит брать сервер помощнее.
Готовимся к работе
Подключаемся к серверу и быстренько наводим порядок. Для начала устанавливаем обновления. В терминале пишем:
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 в отдельной статье.
на курсы от GeekBrains до 24 ноября
Сначала проверим максимально допустимое число одновременно подключённых слушателей:
<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
Создаём у себя на компьютере текстовый файл и вносим туда строку вида:
Сохраняем файл с расширением .m3u и открываем его в аудиопроигрывателе. Если в папке Music лежат треки, радио должно играть.
На этом пока всё. Надеюсь, материал был вам полезен. Если хотите, чтобы я раскрыл какие-то темы подробнее, оставьте комментарий. А пока — успеха в запуске вашего радио!