Как собрать радио для коллег без единого разрыва

Нет времени читать?

Нет времени читать?

Мы отправим вам статью на почту

Из чего собиралось новогоднее радио для затравки к онлайн-корпоративу и создания праздничного настроения у коллег.

20 января  • 
Кое-какие наработки были полезны даже профессиональным ведущим со своим оборудованием

Привет! Вот уже почти 5 из 10 лет я совмещаю работу сетевиком с любимым хобби — подкастом про ИТ. За это время наш сервер для аудиотрансляций развивался, менялся и оказался полезен не только нам, но и коллегам. Недавно я правильно клонировал нашу сборку на базе Linux для радио ЦОД.fm в DataLine и решил поделиться своими наработками со всем сообществом.

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

Для начала определимся с задачами

Чтобы радио радовало коллег качеством звука, стоит учесть несколько компонентов для разных задач:

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

Кроме того, если вы такой же энтузиаст и собираете радио как pet-project в свободное время, скорее всего ваш бюджет ограничен. Так что я не буду останавливаться на дорогих проприетарных продуктах для этих задач, а покажу решения на свободно распространяемом и условно-бесплатном ПО.

Сервер трансляции с блэкджеком TeamSpeak’oм и постобработкой

Свой сервер я собирал на базе Xubuntu 20.04 с lowlatency-ядром. Расскажу, какие компоненты на нем установлены, а потом покажу, как выставляю для них приоритеты.

OBS для обработки на лету. Под капотом сервера у меня Open Broadcaster Software (OBS). С помощью этого софта можно моментально обрабатывать аудио: поднимать громкость до нужного уровня, добавить компрессию, убрать пики, добавить джинглы и фоновую музыку:

Во время эфира я запускаю джинглы, музыку и голос на микшере в OBS
Во время эфира я запускаю джинглы, музыку и голос на микшере в OBS

У OBS есть фильтры, которые можно навесить на каждую аудиодорожку перед ее отправкой в эфир. У меня настроены 5 фильтров в таком порядке:

  1. Limiter срезает все пиковые частоты звука, предотвращает клиппинг и перегрузки.
  1. Noise Suppression удаляет с дорожки фоновый шум, так как шипящие дорожки нам ни к чему.
  1. Усилитель Gain повышает громкость звука до заданного значения.
  1. Compressor сглаживает перепады громкости звука, например, если кто-то начинает очень бурную дискуссию или, наоборот, начинает шептать на ушко.
  1. В конце еще раз использую Limiter, чтобы убрать возможные пики от фильтра Compressor.

С помощью OBS мы запускаем и тестовые трансляции: стримим все по локальной ссылке, проверяем настройки, — а потом настроенный стрим отправляется по боевому урлу.

Tigervnc-standalone-server для управления сервером. Мы подключаемся к серверу любым SSH-клиентом, не забывая про туннелирование порта 5901. Получаем стандартную связку SSH +VNC. Кто не хочет туннелировать SSH, может воспользоваться любым VPN на свой выбор: его можно терминировать непосредственно с сервера или с роутера.

Virtual Audio Cable (и никакой магии), чтобы забирать звук с клиента TeamSpeak в OBS.

Icecast в связке с nginx и OBS для раздачи. OBS позволяет одновременно стримить радио в несколько мест, например, наш подкаст параллельно идет на Youtube.

Для раздачи по протоколу https на сервере установлен Icecast: он принимает потоки голосовых данных от OBS и раздает потоки исходящего трафика на слушателей.

TeamSpeak для синхронизации действий и записи. В нашем подкасте мы используем TeamSpeak для боевого канала и записи эфира. На сервере установлен TeamSpeak Server и TeamSpeak Client. Ведущие подключаются к TeamSpeak Server с помощью своих клиентов. К серверу через локального клиента подключен podbot — некая немая сущность, которая всегда живет в канале и только слушает. Она нужна, чтобы на сервер приходил стрим от всех остальных, который можно перенаправить в Virtual Audio Cable.

Так выглядит рабочее окружение для ведущего. Справа боевой канал в TeamSpeak, который потом уходит в OBS (слева):

На тестовой трансляции мы используем TeamSpeak как микшер, чтобы выровнять всех гостей:

Во время боевой трансляции звук в служебном канале уже настроенный и ровный, можно записать стрим и потом выложить запись с минимальным редактированием:

Записываем дорожки всех участников. Полезно, когда через TeamSpeak идет продовая трансляция, как это сделано у меня в linkmeup.
Записываем дорожки всех участников. Полезно, когда через TeamSpeak идет продовая трансляция, как это сделано у меня в linkmeup.

Чтобы бесшумно синхронизироваться друг с другом по организационным моментам, мы используем чат в TeamSpeak. Создали систему специальных сигналов, наподобие этого:

Также пробовали для этого Zoom, где можно видеть друг друга и обмениваться жестами.

Для ЦОД.fm я организовал на базе TeamSpeak служебный аудиоканал, где все слышат комментарии друг друга, но не выводят их в эфир. Получилась такая виртуальная студия, в которой редактор эфира решал технические и организационные вопросы с ведущими.

Настройка nice-приоритетов на сервере. Я отдаю высший приоритет системным вызовам, затем обрабатываю звук, все остальное потом.

Видим правильные nice-приоритеты — уже половина успеха:

Настраиваем правильные лимиты, чтобы не получить лаги в эфире:

sudo vi /etc/security/limits.conf
@audio           -       rtprio          99
@audio           -       memlock         unlimited
@audio           -       nice            -19
sudo usermod -a -G audio user

Отсыплем демону, отвечающему за звук, нужных значений приоритетов:

sudo vi /etc/pulse/daemon.conf
high-priority = yes
nice-level = -11
realtime-priority = 9

Создадим виртуальные аудиокабели:

sudo vi /etc/pulse/default.pa
load-module module-jack-sink sink_name=vlink1 sink_properties=device.description=vlink1
load-module module-jack-sink sink_name=vlink2 sink_properties=device.description=vlink2
load-module module-jack-sink sink_name=vlink3 sink_properties=device.description=vlink3

Важные мелочи для пользователей

Для радио ЦОД.fm я завел отдельное доменное имя, настроил nginx, разобрался с шифрованием трафика и сертификатами. Даже любительскую радиостанцию лучше стримить по защищенному соединению, да и слушатели не будут ругаться на отсутствующий https. Позаботился о проксировании, чтобы сотрудник мог открывать стрим с любого удобного устройства с любым плеером. Но, если что, можно организовать стрим с этими инструментами и в локальной сети.

Для внешнего домена, само собой, стоит настроить фаервол и защиту от DDoS. На каждый глобальный IP-адрес я ограничивал количество TCP-соединений до 10. Перед запуском всей системы провел нагрузочное тестирование.

Для наших партнеров и ведущих подготовил инструкцию по запуску сервера и клиентской части: как включать фоновую музыку на OBS и выводить участника в эфир:

Еще можно создать чат радиостанции в вашем любимом мессенджере и принимать там сообщения в эфир, приветы, заявки на музыку и т. д. Тут уже кто как любит.

Будем использовать этот сервер для онлайн-трансляций дружественных подкастов «Поддатой», «Разговоры из-под фальшпола» и «Немного об оружии». Через некоторое время планирую выложить нашу сборку на github для других таких же энтузиастов. Улучшим сервер аудиотрансляций вместе, буду ждать ваших PR =) Кому нужно прямо сейчас, например, в формате OVA\OVF, пишите в телеграм NAT_GTX.  

Расскажите друзьям и коллегам о статье
  • Поделиться
  • Поделиться
  • Поделиться

Последние статьи

22 июля
Сергей Жильцов

Распространенные уязвимости контейнеров и десятка правил для их защиты.

15 июля
Станислав Миллер

Новые рекомендации по внедрению ИБ для компаний разного масштаба.

24 июня
DataLine

Подпишитесь на нашу рассылку

Получайте свежие и полезные материалы и приглашения на наши мероприятия

randomness