Поднимаем очередное интернет-радио

    Но не простое, а более-менее автоматизированное.
    Делать мы будем круглосуточное радио с периодическими вещаниями диджеев, автоматическим созданием low-потока и записью эфиров.
    Не смотря на то, что используемые решения довольно тривиальны, топик призван в первую очередь эти тривиальные решения увидеть.

    Для дела этого нам понадобятся лишь mpd и 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, остальные два — для вещания диджеев.

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

    Нам нужно, чтобы слушателям не нужно было переподключаться каждый раз, когда начинается/заканчивается эфир. Сделать это в айскасте очень просто: fallback-mount.
    Приведем наш конфиг маунтов в айскасте к такому виду:
    <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>

    С помощью fallback-mount мы указали айскасу отдавать клиентам поток /mpd.ogg при отсутствии вещания на /radio_low.ogg и /radio_high.ogg.
    А флаг fallback-override позволяет возвращать клиентов на этот маунт при начале вещания на него.
    Очень просто, не так ли?

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

    Задача вторая: автоматическое создание low-потока.

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

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

    Айскаст поддерживает запись потока в файл. К сожалению, он не умеет сам разделять файлы, и потому при каждом новом эфире старый файл будет перезаписан. К счастью, он умеет выполнять скрипты при старте/окончании вещания.
    Записывать нам нужно лишь high-поток, поскольку диджеи вещают только на него.
    Слегка исправим конфиг айскаста:
    <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-конференции.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 12

    • UFO just landed and posted this here
        0
        Mpd в данном случае играет исключительно заготовленный плейлист. Диджеи вещают с помощью sam broadcaster/idjc/whatever. Просто же пример конфига, как уже сказано, есть в поставке самого mpd.
        Насчет проигрывания определенных треков и составления плейлистов по заявкам я обязательно напишу статью, как только сам это реализую.
        Добраться до плейлиста можно с помощью mpc. С помощью его же и простенького скрипта можно получить предыдущие/следующие треки, при условии что выключен random.
        • UFO just landed and posted this here
            0
            В таком случае нужно именно рандомно заполнять плейлист, запоминая, что мы добавили, и, соответственно, запоминать, что мы проиграли.
            • UFO just landed and posted this here
        +1
        ТС, это делается на два порядка круче и гибче посредством liquidsoap.
          0
          Какой именно гибкости и крутости вам тут не хватает?
            0
            ммм. ну, скажем, ему не нужны сторонние скрипты для записи.
            с ним можно сделать систему заявок с сайта.
            несколько диджеев из разных мест — тоже не проблема.
            не нужен отдельный экземпляр плеера для low-потока.
            нормально?
              0
              Ну, делать заявки задача пока не стоит.
              А так да, вполне. Поковыряю обязательно. Спасибо.
          0
          проигрывание каждых 10 треков, наверное, реализовывать надо на этапе формирования плейлиста. Тут, наверное, даже крон (ннкрон) и баш (батники) в состоянии справиться.

          А вообще, все-таки было бы здорово. если бы существовал некий комплекс вещательный (опенсорсный), который бы позволял очень гибко настраивать параметры вещания, ту же частоту повторения джинглов, запуск необходимых треков в заданное время.

          У меня в свое время была идея организовать в локальной сети некую социальную сеть радиовещателей и слушателей. Тогда у нас в сети было очень популярно слушать потоковое радио и пробовать что-то вещать.

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

          1. Радиовещатель регистрируется на сайте, который собой представляет что-то вроде фейсбука, ну без излишеств. Там он оставляет анонсы, пишет о себе и о музыке, оставляет плейлисты, общается со слушателями. В общем имеет собственную страницу.

          2. С регистрацией и/или после админского одобрения он получает (что опять же легко автоматизируется даже под windows) личный аккаунт на ftp, куда может сливать файлы для вещания, свои диджейские сеты.

          3. На сайте было задумано так, что круглые сутки играет рандомно различная музыка (были в задумке и тематические дни). А с 22.00 и до 02.00 было зарезервировано время для диджейских сетов. Диджей через сайт подает заявку с желанием выступить в определенный день и время (из свободных), предварительно залив файлы на фтп. Сайт резервирует необходимое время, проверяет содержимое фтп, генерирует плейлист, просит у юзверя подтверждения и информацию о сете, копирует файлы в неприкосаемое место и вносит изменения в глобальный плейлист. Все это происходит автоматически. Да, так же добавляется на главную страницу ссылка на анонс и обновляется всякая соответствующая информация, сетка вещания.

          4. Когда время подходит к часу ч, запускается джингл, затем диджейский сет, на сайте в это время отображается плейлист, а диджей имеет возможность общаться с благодарными слушателями :)

          Вот бы кто реализовал такое в виде некоего пакета скриптов и программ с установкой одним кликом :)
            +1
            Вот выше посоветовали liquidsoap. Судя по описанию он все это позволяет вполне.
            +1
            мои две копейки: официальный айскаст не обновлялся с середины 2008, и брать его лучше отсюда (там сорцы и билды win32):
            www.xiphicecast.webspace.virginmedia.com/

            Only users with full accounts can post comments. Log in, please.