Создаем интернет-радио на Liquidsoap (Часть III)

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

 МУЗЫКА

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

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

utro = random(weights=[1,3],[jin,utro])
den = random(weights=[1,3],[jin,den])
vecher = random(weights=[1,3],[jin,vecher])
noch = random(weights=[1,5],[jin,noch])

В этом нам помогает функция random, которая согласно указанному весу формирует новый источник. В нашем случае 1 айдишка через 3 музыкальных композиции утром, днем и вечером, а ночью через 5.

clocksay = switch([({00h00m00s},clock00),({12h00m00s},clock12)])

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

music = switch(track_sensitive = true, [({6h00m00s-11h59m59s},utro),({12h00m00s-17h59m59s},den),({18h00m00s-23h59m59s},vecher),({00h00m00s-5h59m59s},noch)])

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

ФОРМИРУЕМ ЭФИРНЫЙ ПОТОК

Формирование эфирного потока производится путем выстраивания специального источника, который всегда должен что-то воспроизводить и использовать принцип нисходящего приоритета очереди. Да! Даже если вы планируете тишину или по какой то причине случился сбой в одном из музыкальных блоков, эту тишину (или белый шум) необходимо воспроизводить!

record = fallback(id="REC", track_sensitive = false, ([my_rec_program,live_rep]))
ready_air = fallback(id="STREAM", track_sensitive = false, ([
    fallback.skip(input=live, nrj(fallback.skip(input=record,music))),
    blank()
]))
ready_air = add([ready_air, amplify(1.,clocksay)])
ready_air = add([ready_air, amplify(1.,liveover)])
radio = smart_crossfade(ready_air)

Этот блок конфигурационного файла или программы вашей интернет-радиостанции самый сложный и запутанный (на первый взгляд).

В первой строке мы создаем новый источник повтора и ранее записанной программы. Функция fallback организовывает очередь с нисходящим приоритетом, т.е. my_rec_program имеет высший приоритет над live_rep.

В следующей строке fallback выстраивает очередь из источников прямого эфира, записей, музыкальных блоков и тишины (blank()). Но внутри используется еще одна функция — fallback.skip. Она нам необходима при обратном переключении источников: от прямого эфира или записанных программ к музыкальному блоку.

Так уж заложено в liquidsoap, что когда происходит переключение с одного источника на другой — первый источник встает на паузу. И если не применять fallback.skip, то при возврате к музыке, чаще всего вы будете попадать на середину песни.

Так же стоит обратить внимание, что источник с записями и музыкой дополнительно обрабатывается функцией nrj(). Это встроенный нормалайзер с компрессором для придания ровного звучания по уровню громкости. Использовать его для прямых включений не рекомендовано.

Далее мы накладываем на источник говорящие часы, источник для оповещения без приостановки текущего вещания и добавляем «умный» микшер треков. В 80% «умный» микшер достойно сводит музыкальные композиции, записи и переход на прямое включение.

ВЫВОДИМ НА ICECAST

Вот мы и добрались до главного блока, блока вывода потоков на icecast сервер.

clock.assign_new(id="My Radio",[radio])
output.icecast(%mp3(bitrate=192, samplerate = 44100, stereo = true), host = "127.0.0.1", port = 8000, name="My Radio", genre="various", url="http://www.mysite.ru", description="Мое интернет-радио", password = "icecast_password", mount = "/192kbps", radio)
output.icecast(%mp3(bitrate=96, samplerate = 44100, stereo = false), host = "127.0.0.1", port = 8000, name="My Radio", genre="various", url="http://www.mysite.ru", description="Мое интернет-радио", password = "icecast_password", mount = "/96kbps", mean(radio))
output.icecast(%mp3(bitrate=24, samplerate = 22050, stereo = false), host = "127.0.0.1", port = 8000, name="My Radio", genre="various", url="http://www.mysite.ru", description="Мое интернет-радио", password = "icecast_password", mount = "/24kbps", mean(radio))

В первой строке мы принудительно «прибиваем» часы, а затем создаем три потока на три mountpoint. И если icecast уже настроен (а подразумевается, что да), то можно дело осталось за самым малым — написание дополнительных скриптов: скрипт для вечернего музыкального блока и скрипты для запуска повтора и заранее подготовленной программы.

Продолжение следует…

Создаем интернет-радио на Liquidsoap (Часть III): 13 комментариев

    1. Вначале я подумал, что упустил это, а нет… Перечитал все статьи и об этом все написано. Так что рекомендую перечитать все внимательно, тут все есть.

          1. Скажите пожалуйста, для организации вывода истории воспроизведения и показа следующих треков — в какую сторону смотреть? при рандомном воспроизведении liqiudsoap где-то создает комбинацию треков или как это провернуть?

  1. Интересная статья, только у меня возник один вопрос. Как установить подсветку синтаксиса? Для liquidsoap нет соответствующего.

  2. хорошо написана статья, заинтересовало, у меня дебиан 8, сначала собрал ices0.4 — работает, потом ezstream 0.6, тоже работает не плохо, далее собрал IDJC — ну тут в зависимостях сервер jack(d) — пришлось ставить доп.модуль для pulseaudio, иначе skype не работает через jack, не умеет он, а вот liquidsoap — самое то, собирать не стал, дебиановское все работает, мне пока хватило следующего:
    liquidsoap_1.1.1-7+b1_i386.deb, libcamomile-ocaml-data_0.8.4-4_all.deb, liquidsoap-plugin-icecast_1.1.1-7+b1_i386.deb, liquidsoap-plugin-lame_1.1.1-7+b1_i386.deb, liquidsoap-plugin-mad_1.1.1-7+b1_i386.deb, liquidsoap-plugin-pulseaudio_1.1.1-7+b1_i386.deb, liquidsoap-plugin-taglib_1.1.1-7+b1_i386.deb
    немного отличается синтаксис уже, но простейшая вещалка выглядит так у меня:

    #!/usr/bin/liquidsoap
    set(«log.file»,false)
    # Log dir
    #set(«log.file.path», «~/Загрузки/Radio.log»)
    # Music
    myplaylist = mksafe(normalize(playlist(«~/Музыка/playlist.txt»)))
    # Some jingles
    jingles = mksafe(normalize(playlist(«~/Jingles/playlist.txt»)))
    # Start building the feed with music
    radio = myplaylist
    # Now add some jingles
    radio = rotate(weights = [1, 4],[jingles, radio])
    output.icecast(
    %mp3(bitrate=128),
    host = «giss.tv»,
    port = 8000,
    name = «xxxx»,
    description = «liquidsoap»,
    genre = «various»,
    url = «http://giss.tv:8000/xxxx»,
    password = «xxxx»,
    mount = «xxxx»,
    radio
    )

    создать playlist:
    $ find ~/Музыка/ -name ‘*.mp3’ -exec echo ‘{}’ \; > ~/Музыка/playlist.txt
    $ chmod u+x radiostart.liq (так я назвал свой скрипт)
    … жду продолжения темы, автору респект!

Обсуждение закрыто.