Мы Поднимаем Еще Одно Интернет-Радио

Но не простой, а более-менее автоматизированный.

Сделаем круглосуточное радио с периодическими диджейскими трансляциями, автоматическим созданием лоу-стримов и записью эфиров.

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

Для этого нам нужны только mpd и Icecast. Я не буду рассматривать их установку и общую настройку, потому что первое тривиально, а для второго приведены примеры конфигов.

Будем считать, что вы это уже сделали.

Задача ноль: Подготовка.

Нам понадобятся три точки монтирования в Icecast. Давайте определим их:

<mount> <mount-name>/mpd.ogg</mount-name> </mount> <mount> <mount-name>/radio_high.ogg</mount-name> </mount> <mount> <mount-name>/radio_low.ogg</mount-name> </mount>

Первый нам понадобится для круглосуточного вещания с mpd, два других для DJ-вещания.

Задача первая: Круглосуточное вещание с периодическими выступлениями диджеев.

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

В Icecast это сделать очень просто: Fallback-mount. Приведем наш конфиг монтирования в Icecast к такому виду:

<mount> <mount-name>/mpd.ogg</mount-name> </mount> <mount> <mount-name>/radio_high.ogg</mount-name> <fallback-mount>/mpd.ogg</fallback-mount> <fallback-override>1</fallback-override> </mount> <mount> <mount-name>/radio_low.ogg</mount-name> <fallback-mount>/mpd.ogg</fallback-mount> <fallback-override>1</fallback-override> </mount>

Используя резервное монтирование, мы сказали ISCAS предоставлять клиентам поток /mpd.ogg, когда нет трансляции на /radio_low.ogg и /radio_high.ogg. А флаг Fallback-override позволяет возвращать клиентов на это монтирование при запуске трансляции на него.

Очень просто, не так ли? Вроде все хорошо, но не все диджеи могут позволить себе вещание в два потока, да и это не очень удобно.

Задача вторая: автоматическое создание малорасхода.

Для этого мы будем использовать тот же mpd, но напишем для него новый конфиг.

Вам нужно будет изменить как минимум пути к библиотеке, плейлистам и pid-файлу, чтобы не было конфликтов между двумя копиями mpd. Вывод необходимо будет отправить на монтирование Icecast /radio-low.ogg. Теперь все, что нам нужно сделать, это запустить новую копию mpd с этим конфигом и добавить в плейлист адрес высокоскоростного радио.

Таким образом, MPD, как и любой другой клиент, принимает либо трансляцию от основного MPD, либо DJ-трансляцию, перекодирует ее и отправляет в low-поток.

Задача решена.

Последнее задание: автоматическая запись трансляции.

Icecast поддерживает запись потока в файл.

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

К счастью, он может выполнять сценарии при начале/окончании трансляции.

Нам нужно записать только высокий поток, так как диджеи вещают только на него.

Немного подправим конфиг Icecast:

<mount> <mount-name>/mpd.ogg</mount-name> </mount> <mount> <mount-name>/radio_high.ogg</mount-name> <fallback-mount>/mpd.ogg</fallback-mount> <fallback-override>1</fallback-override> <dump-file>/tmp/radio_high.ogg</dump-file> <on-disconnect>/path/to/my/script/stend.pl</on-disconnect> </mount> <mount> <mount-name>/radio_low.ogg</mount-name> <fallback-mount>/mpd.ogg</fallback-mount> <fallback-override>1</fallback-override> </mount>

Мы указали, куда записывать поток и какой скрипт запустить после окончания трансляции.

Я рекомендую называть файл дампа по имени точки монтирования, поскольку именно точка монтирования передается сценарию в качестве параметра.

Остаётся только написать вот такой скрипт:

#!/usr/bin/env perl use strict; use warnings; use DateTime; my $path="/path/to/my/archive/"; my $mn=$ARGV[0]; $mn=~s|/||; my $dt=DateTime->now; my $dmy = $dt->dmy('_'); my $fname=$path.$dmy."_".

time().

"_".

$mn; `mv /tmp/$mn $fname`;

Все, что делает сценарий, — это перемещает файл дампа в каталог, указанный в $path, называя его по текущей дате и имени потока.

Вот и все, собственно.

Если сообществу будет интересно, в следующей статье я расскажу, как сделать уведомление о текущих треках и трансляциях с помощью бота в Jabber-конференции.

Теги: #радио #howto #mpd #icecast #Čulan

Вместе с данным постом часто просматривают: