Liquidsoap



Liquidsoap — это язык программирования для аудио, разработанный первоначально для создания аудио- и видеопотоков, передаваемых из исходного потока на Icecast сервер. Различие с любыми другими доступными утилитами — это то, что Liquidsoap интерпретирует отдельный скриптовой язык, что делает его очень универсальным и адаптирующимся к различным применениям.

Последние релизы Liquidsoap также включают в себя возможность взаимодействовать с локальной звуковой картой для вывода аудиоданных на устройство воспроизведения, а также сохранять в локальные файлы, используя различные форматы. Таким образом, Liquidsoap является не только источником аудио- и видео потока для Icecast, но и общецелевым специализированным языком аудио, с возможностью автоматизации обработки и трансляции аудио и видео.

Liquidsoap опубликован под GNU General Public License (GPL), является частью проекта Savonet, и разрабатывается на языке OCaml. Проект Savonet так же поддерживает OCaml модули, используемые для различных дополнительных возможностей, поддерживаемых в Liquidsoap.

Дизайн

Описание аудиопотока может быть очень сложным: некоторые входные источники (файлы, перенаправление потока, вход звуковой карты) могут быть объединены различными способами (обработки звука, воспроизведение планирования, микширование, fall-back’и) и в конечном итоге могут быть выведены в любом другом виде (на несколько серверов или в нескольких форматах). Чтобы сделать это простым без больших затрат энергии, Liquidsoap использует собственный небольшой скриптовой язык для настройки.

В этом языке есть понятие аудиопотока и запроса, и встроенные функции для объединения потоков разными способами. Некоторые из его основных особенностей:

  • Он статически типизирован: сервер никогда не рухнет, если сделал опечатку в темном углу конфигурации.
  • Типы выводятся сами: вам не придется прописывать их.
  • Это функциональный язык: Вы можете задать свои составные операции, но также используются функции для описания переходов от одного потока к другому.

Потоки

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

Кроме того, поток — это объект высокого порядка, что представляет собой бесконечную последовательность звуковых или видео выборок данных, а также метаданные и разрывы, которые представлены границами треков-композиций.

Например, поток может быть выбран из внешнего потока аудио следующим образом:

s = input.http("http://server.org:8000/stream")

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

s = amplify(2.0, s)

В конце концов, поток прошел к выходу, который может быть и звуковой картой, и JACK-сервером и файлом, и т. д., или можно выводить на удаленный сервер. Например, на сервер Icecast:

output.icecast.vorbis(host="server.org",mount="my_radio", s)

Функциональный язык

Язык Liquidsoap — это язык функционального программирования. Таким образом, функции могут быть использованы в качестве переменных. В частности, так как потоки — это бесконечные объекты, единственный способ, чтобы применить операцию для каждого элемента потока, является определением обобщенной функции, которая применяется к каждому элементу, когда он создается.

Например, вы можете определить операцию для всех метаданных, переносимых потоком:

# Функция, исполняющая какое-то действие с метаданными def f(m) = (.. Какие-то операции с m ..) end # Переопределение s и применение f # для всех метаданных s = on_metadata(f, s)