Документация на Flussonic Media Server

  1. Быстрый старт
  2. How To
  3. Потоковое вещание
    1. Публикация
    2. Прием мультикаста
    3. Варианты источников
    4. Переключение источников
    5. Плейлисты
    6. Наложение логотипа
    7. Миксер
    8. WebRTC публикация
    9. SDI
    10. Отправка на другие сервера
    11. Распознавание DVB субтитров
  4. Транскодер
    1. Логотип
    2. Hardware
    3. Скриншоты
    4. Мозаика
  5. DRM
    1. Simple CAS
    2. Conax DRM
    3. BuyDRM (KeyOS)
  6. Авторизация
    1. Конструктор бэкендов
    2. Сервис сбора статистики
    3. Domain lock
    4. Middleware
    5. Secure links
    6. Ограничение сессий
    7. Мультиавторизация
    8. Бан IP адресов
    9. DVR
    10. Aliaser
  7. API
    1. HTTP API
    2. Events API
    3. MySQL API
    4. SQL API для кластеров
    5. SNMP
  8. Кластер
    1. Ретрансляция
    2. Кластерный захват
    3. Балансировщик нагрузки
    4. Пиринг
    5. Организация CDN
  9. VOD
    1. Кэш
    2. Облако
    3. Транскодирование файлов
  10. DVR
    1. Настройка
    2. Timeshift
    3. Catchup
    4. Проигрывание
    5. Экспорт в MP4
    6. Доступ по протоколам
    7. Timelapse
    8. API
    9. Кластеризация DVR
    10. Репликация
    11. Облако
  11. Воспроизведение
    1. HLS
    2. embed.html
    3. HTML5 с низкой задержкой
    4. Плеер HTML5 с низкой задержкой
    5. MPEG-TS
    6. RTMP
    7. DASH
    8. HDS
    9. RTSP
    10. multicast, CBR UDP
    11. WebRTC проигрывание
    12. H.265
  12. Администрирование
    1. Установка
    2. Обновление

    3. Конфигурация
    4. Мониторинг
    5. Производительность
    6. Лицензия
    7. LUA скрипты
    8. Безопасность
    9. Let's Encrypt
    10. Миграция
  13. IPTV
    1. Захват спутникового видео
    2. Транскодирование
    3. Middleware в IPTV OTT
    4. Экспорт EPG со спутника
    5. Группы каналов

Скрипты на Lua

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

Важно! Вся описанная в этом разделе функциональность является экспериментальной и может поменяться без предупреждения.

В дополнение к стандартной библиотеке lua, Flussonic Media Server добавляет некоторые возможности к скриптам:

HTTP клиент

http.get(url) http.get(url, headers) http.get(url, headers, body) http.get(url, headers, timeout) http.get(url, headers, body, timeout) Посылается HTTP GET запрос. В ответ приходит таблица с ключами: code, headers, body.

http.post(url) Посылается HTTP POSt запрос. Аргументы и ответ аналогично http.get.

http.qs_encode(table) Таблица кодируется в query string.

JSON модуль

json.encode(table) Таблица переводится в JSON

json.decode(text) JSON переводится в таблицу

Flussonic API

flussonic.config() возвращается частичный конфиг эрливидео

flussonic.streams() текущий список потоков

flussonic.files() текущий список открытых файлов

flussonic.caches() текущий список дисковых кешей

flussonic.clients() flussonic.clients(stream) текущий список либо всех сессий, либо сессий конкретного потока

flussonic.log(text) вывод в лог средствами эрливидео

flussonic.debug(text) отладочный вывод в лог средствами эрливидео

flussonic.now() текущее время UTC

flussonic.uuid() генерируется uuid

table.to_string(table) возвращет таблицу в текстовом представлении

Comet-сервер

comet.create_channel("channel") comet.create_channel("channel", 100) создается канал во внутреннем комет-сервере. Опционально указывается таймаут жизни канала

comet.send("channel", "message") посылается сообщение по каналу внутреннего комет-сервера

SWIFT клиент

auth_info = swift.auth("http://proxy-server/", "account", "password") возвращаются авторизационные данные для дальнейших обращений

swift.list_containers(auth_info) список контейнеров авторизованного аккаунта

swift.create_container(auth_info, 'videos') swift.create_container(auth_info, 'videos', {}) создание контейнера, возможно с метадатой

swift.delete_container(auth_info, 'videos') удаление контейнера

swift.list_objects(auth_info, 'videos') список объектов в контейнере

swift.create_object(auth_info, 'videos', 'file.txt', 'contents') создание объекта

swift.upload_file(auth_info, 'videos', 'remote_path.mp4', 'local_path.mp4') swift.upload_file(auth_info, 'videos', 'remote_path.mp4', 'local_path.mp4', 'local_callback_name') загрузка файла. Так же можно указать в виде строчки имя локальной функции, которая будет вызываться во время загрузки для индикации загрузки на сервер

FTP клиент

ftp.list("ftp://user:password@host/path") список файлов в каталоге

ftp.upload("local.mp4", "ftp://user:password@host/path/remote.mp4") function progress(p) end ftp.upload("local.mp4", "ftp://user:password@host/path/remote.mp4", "progress") локальный файл загружается на ftp. Опционально вызывается коллбек для статуса загрузки

Crypto API

crypto.md5("Hi") md5 в hex виде

crypto.sha1("Hi") sha1 в hex виде

crypto.sha256("Hi") sha256 в hex виде

Авторизация с помощью Lua Anchor Anchor x2

Авторизационный бекенд на Lua должен представлять из себя обычный скрипт, результат которого должен возвращаться в конце оператором return. В этот скрипт передается дополнительная глобальная таблица req со следующими полями, часть из которых опциональная:

  • token - token из query string или автосгенерированный
  • ip - IP-адрес пользователя
  • name - имя потока/файла
  • referer - опционально referer плеера (адрес страницы на которой он вставлен)

Должен быть ответ return true, {user_id = 15, unique = true}, return "redirect", "http://someotherserver/path" либо return false, {code = 403}

Обработчики событий Anchor Anchor x2

Пример использования Lua для фильтрации и отправки внутренних событий Flussonic Media Server приведен в разделе Events API.

Веб-скрипты Anchor Anchor x2

Lua можно использовать для генерации веб-страниц с использованием инфраструктуры Flussonic Media Server.

Для этого надо указать в конфиге: web_script mytest priv/myscripts;

После этого при обращении к адресу http://192.168.2.3:8080/mytest/counter будет вызван lua-скрипт priv/myscripts/web.lua, в нём будет вызвана функция http_handler.counter(req):

http_handler = {}

http_handler.counter = function(req)
  if not req.cookies.flusession then
    session_id = flussonic.uuid()
    headers = {}
    headers["Set-Cookie"] = "flusession="..session_id
    headers["Location"] = "/mytest/counter"
    return "http", 302, headers, "auth\n"
  else
    session_id = req.cookies.flusession
    value = flussonic.session.get(session_id, "key1")
    if not value or value == "undefined" then
      flussonic.session.set(session_id, "key1", 1)
    end
    value = flussonic.session.get(session_id, "key1")
    flussonic.session.set(session_id, "key1", value + 1)
    return "http", 200, {}, tostring(value).."\n"
  end
end

Теперь к этому скрипту можно обратиться:

$ curl -v http://localhost:8080/mytest/counter
...
< HTTP/1.1 302 Found
< Connection: keep-alive
< Server: Cowboy
< Date: Fri, 06 Mar 2015 10:20:13 GMT
< Content-Length: 5
< Location: /mytest/counter
< Set-Cookie: flusession=4a41cc61-b089-4cd5-9c4a-28402c6db525
$ curl -s http://localhost:8080/mytest/counter -H 'Cookie: flusession=4a41cc61-b089-4cd5-9c4a-28402c6db525'
1
$ curl -s http://localhost:8080/mytest/counter -H 'Cookie: flusession=4a41cc61-b089-4cd5-9c4a-28402c6db525'
2
$ curl -s http://localhost:8080/mytest/counter -H 'Cookie: flusession=4a41cc61-b089-4cd5-9c4a-28402c6db525'
3
$ curl -s http://localhost:8080/mytest/counter -H 'Cookie: flusession=4a41cc61-b089-4cd5-9c4a-28402c6db525'
4

В этом скрипте будут доступны все описанные выше функции. Так же доступна таблица req:

  • req.query - разобранная query string
  • req.headers - HTTP заголовки
  • req.method - HTTP метод заглавными буквами
  • req.body - тело HTTP заголовка. Если это тело идет в формате www-form-encoded, то его надо самостоятельно в lua разобрать с помощью http.qs_decode:
if req.method == "POST" then
  post = http.qs_decode(req.body)
end

Lua скрипт может вернуть следующие варианты ответа:

  • return "http", 200, {["Content-Type"] = "text/plain"}, "Hello, world!\n" - Можно отдать http ответ напрямую
  • return "json", {key = "value"} - таблица будет упакована в JSON
  • return "template", {var1 = "value1", var2 = "value2"} - в этом случае эрливидео возьмет файл, который называется priv/cameras/list.html, который должен представлять из себя валидный DTL шаблон, в который подставятся значения из скрипта
  • return "template", {headers = {}}, {var1 = "value1"} - то же самое, но с возможностью выставить заголовки

Примеры Anchor Anchor x2

Иногда возникает задача отключить авторизацию для вторичных серверов, т.е. для нескольких IP адресов. Что бы не вносить эту логику в бекенд, можно написать собственный скрипт авторизации:

if req.ip == "94.95.96.97" then
  return true, {}
end

reply = http.get("http://backend/script.php")

if not reply.code == 200 then
  return false, {code = reply.code}
end

opts = {}
if reply.headers["x-userid"] then
  opts.user_id = reply.headers["x-userid"]
end

if reply.headers["x-unique"] then
  opts.unique = true
end

return true, opts