Moment Video Server
Настройка

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

Основной конфигурационный файл

По умолчанию основной конфигурационный файл видеосервера — /opt/moment/moment.conf
Другой путь к конфигурационному файлу можно задать опцией -c при запуске сервера:

/opt/moment/bin/moment -c /path/to/moment.conf

Синтаксис файла moment.conf

Файл конфигурации состоит из секций. Каждая секция ограничена фигурными скобками {}. Секции могут иметь название. Допускаются вложенные секции.

MySection {
  InnerSection {
  }
}

Внутри секций задаются параметры. Строковые значения рекомендуется заключать в двойные кавычки. Параметры можно разделять точкой с запятой или переводом строки.

Section {
  MyParameter = "MyValue"
  width = 60; height = 40
}

Возможно использование директив препроцессора C (кроме #include):

#define VPATH "file:///this/is/a/long/path/"
mod_gst {
  FirstVideo  = VPATH "first_video.ogv"
  SecondVideo = VPATH "second_video.flv"
}

Можно делать комментарии в стиле C:

http {
  // Однострочный комментарий
  /* Многострочный комментарий */
  #if 0
    #if 0
      Вложенный многострочный комментарий.
    #endif
  #endif
}

Сетевые адреса в значениях параметров имеют вид "ip-адрес:порт" или "dns-имя:порт". Адрес или порт можно опустить. Примеры адресов: "momentvideo.org:80", "kernel.org", "192.168.0.1", ":8080".

Будем обозначать параметры конфигурации полным путём к параметру по секциям. Например, параметр my/deep/parameter в файле конфигурации задаётся так:

my {
  deep {
    parameter = "value"
  }
}

Primary configuration parameters are listed below.

Общие параметры конфигурации

moment/module_path — путь для поиска плагинов к видеосерверу. По умолчанию: /opt/moment/lib/moment-1.0/

moment/num_threads — количество потоков для обслуживания сетевых клиентов. По умолчанию: 0 (обслуживать клиентов в главном потоке).

moment/num_file_threads — количество потоков для записи видео на диск. По умолчанию: 0 (выполнять запись из главного потока).

page_pool/min_pages — минимальное кол-во страниц памяти в пуле страниц на сервере (размер одной страницы - 4 КБ).

Настройки RTMP

За обслуживание Flash-клиентов по протоколам RTMP и RTMPT отвечает модуль mod_rtmp.

mod_rtmp/enable — включить поддержку RTMP и RTMPT (yes/no). По умолчанию: "yes" (включено).

mod_rtmp/rtmp_bind — IP-адрес интерфейса и порт TCP, на который сервер принимает соединения по протоколу RTMP. По умолчанию: ":1935"

mod_rtmp/rtmpt_bind — IP-адрес интерфейса и порт TCP, на который сервер принимает соединения по протоколу RTMPT. По умолчанию: ":8081"

mod_rtmp/rtmpt_session_timeout — таймаут неактивности клиентской сессии RTMPT, в секундах. По истечении таймаута сессия закрывается. По умолчанию: 30 сек.

mod_rtmp/send_delay — задержка отправки аудио и видеосообщений в миллисекундах. Задержка отправки данных (буферизация на сервере) позволяет существенно повысить производительность сервера. Так, при задержке 100 миллисекунд нагрузка на процессор при большом числе одновременно подключенных клиентов снижается в 2,5 раза. Значение по умолчанию: 50 мс.

mod_rtmp/audio_waits_video — не отправлять клиентам аудиосообщения, пока не будет отправлено первое видеосообщение. По умолчанию: "no" (передавать аудио, не дожидаясь видео).

Настройки HTTP

«Момент» может принимать произвольные HTTP-запросы и передавать их на обработку модулям, подписавшимся на запросы с определённым префиксом URI. Для приёма команд администратора в форме HTTP-запросов выделяется отдельный порт.

http/http_bind — адрес привязки HTTP. По этому адресу, в частности, будут доступны статические файлы, отдаваемые модулем mod_file.

http/admin_bind — адрес привязки HTTP для команд администратора. По умолчанию: ":8082"

http/keepalive_timeout — таймаут неактивности HTTP-соединений в секундах. По истечении таймаута соединение разрывается. По умолчанию: 60 сек.

Модуль mod_file предназначен для отдачи HTTP-клиентам небольших статических файлов (HTML-страниц и изображений) с локальных дисков по протоколу HTTP. Этот модуль не предназначен для передачи видео. Параметры конфигурации mod_file:

mod_file/enable — включить mod_file (yes/no). По умолчанию: "yes" (mod_file включен).

Список путей к файлам и соответствующих этим путям префиксов URI задаётся набором безымянных секций. В каждой секции определяются два параметра:

path — директория, из которой отдаются файлы;

prefix — префикс в URI. Например, если файлы должны быть доступны по URI http://myserver.com/my_files/, то параметру prefix нужно присвоить значение "my_files".

Пример настройки mod_file:

mod_file {
  enable = yes
  {
    path = "/opt/moment/myplayer"
    prefix = "moment"
  }
  {
    path = "/opt/moment/mychat"
    prefix = "mychat"
  }
}

Получение видео от Flash-клиентов

«Момент» может получать видео от Flash-клиентов и передавать его другим клиентам без дополнительной настройки.

По умолчанию, если клиент подключается и начинает передавать на сервер видео с определённым названием канала, то этот канал становится доступным другим клиентам для просмотра. Автоматическое предоставление доступа к видео можно отключить, присвоив параметру moment/publish_all значение "no". В этом случае передача видео, получаемое от Flash-клиентов, будет доступна только через те плагины видеосервера, которые это разрешают явно.

Захват и перекодирование видео

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

За взаимодействие с GStreamer отвечает модуль mod_gst. Общие настройки модуля:

mod_gst/enable — включить модуль mod_gst. По умолчанию: "yes" (mod_gst включен).

mod_gst/no_video_timeout — таймаут доступности источника видео, в секундах. Если по истечении таймаута от источника не получено ни одного видео- или аудиосообщения, то производится повторное подключение к этому источнику. По умолчанию: 60 сек.

mod_gst/send_metadata — генерировать метаданные (сообщение onMetaData) для формата flv. По умолчанию: "no" (onMetaData не генерируется).

mod_gst/gst_debug — включить отладочные сообщения gstreamer. Отладочные сообщения можно включать для выявления причин неполадок при захвате/перекодировании видео. По умолчанию: "off" (выключено).

С точки зрения настройки видеосервера взаимодействие с GStreamer сводится к заданию конвейеров обработки, определяющих источник видео и последовательность преобразований. Конвейеры состоят из отдельных элементов, каждый из которых выполняет некоторую операцию над видеопотоком. Конвейеры описываются с использованием синтаксиса, принимаемого утилитой gst-launch. Подробную информацию об этой утилите можно найти в системной документации и в документации GStreamer.

Видеопотоки определяются в секции mod_gst/streams. Каждый видеопоток описывается отдельной безымянной секцией. Существует три варианта задания источника видео:

  1. Через URI источника;
  2. Описанием конвейера gstreamer;
  3. Списком воспроизведения (плейлистом).

Параметры описания источника видео, общие для всех способов:

name — название видеопотока. По этому названию клиенты запрашивают у сервера видеопоток.

record_path — путь для записи видео на диск. Если параметр не задан, то запись видео не производится.

Задание источника по URI

Для наиболее простых случаев захвата и перекодирования видео видеосервер предлагает конвейеры предопределённой формы. Это существенно упрощает описание захватываемого видеопотока: достаточно указать URI ресурса, с которого сервер должен получать видео. Для задания источника по URI используется параметр uri. Пример:

  {
    // Получаем видео с IP-камеры по протоколу RTSP.
    name = "Камера 1"
    uri = "rtsp://91.200.224.242/mpeg4/media.amp"
  }

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

mod_gst/width — ширина видео;

mod_gst/height — высота видео;

mod_gst/bitrate — битрейт, определящий степень сжатия видео, Кбит/сек.

Конвейеры gstreamer

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

Here's how a basic pipeline which displays a color table can be tested with gst-launch: Конвейеры описываются строками, в которых перечисляются элементы и определяются связи между ними. Работу конвейеров можно проверять отдельно от видеосервера с помощью утилиты gst-launch. Синтаксис описания конвейеров в файлах конфигурации видеосервера совпадает с синтаксисом, описанным в документации gst-launch. Вот так с помощью gst-launch можно запустить простейший конвейер, выводящий на экран настроечную таблицу цветов:

gst-launch videotestsrc ! autovideosink

Этот конвейер состоит из двух элементов. Элемент videotestsrc генерирует видеопоток (настроечную таблицу), а autovideosink отображает видео на экране в отдельном окне.

Для того, чтобы «Момент» мог использовать конвейер для получения видео, должны быть соблюдены следующие условия:

  1. Цепочка обработки видео должна заканчиваться элементом fakesink с именем "video" (параметр name="video") и параметром sync=true;
  2. Цепочка обработки звука должна заканчиваться элементом fakesink с именем "audio" (параметр name="audio") и параметром sync=true;
  3. Видео и аудио, попадающее в элементы fakesink, должно быть закодировано одним из поддерживаемых видеосервером кодеков.

В потоке может не быть видео или аудио.

При захвате видео через конвейер gstreamer описание конвейера задаётся параметром chain. Примеры готовых конвейеров gstreamer — в следующих разделах. Список всех доступных элементов для построения конвейеров и справку по каждому элементу можно получить с помощью утилиты gst-inspect.

Плейлисты

См. раздел «Списки воспроизведения».

Захват видео с IP-камер

Захват видео с камер осуществляется указанием в конфигурационном файле URI видеопотока, либо заданием конвейера, соответствующего виду потока, отдаваемого камерой. Захват видео по протоколу RTSP:

  uri = "rtsp://10.1.12.3/mpeg4/media.amp"

Конвейер для захвата MJPEG, передаваемого по HTTP, и перекодирования видео в h.264:

  chain = "souphttpsrc location=http://192.168.0.1/mjpg/video.mjpg ! \
           multipartdemux ! jpegdec ! ffmpegcolorspace !             \
           x264enc speed-preset=ultrafast bitrate=500 !  \
           fakesink name=video"

Захват видео с локальных камер

При работе под Linux видео с локальных камер захватывается при помощи подсистемы "Video for Linux". Элемент, выполняющий захват видео — v4l2src. Пример конвейера для захвата видео с камеры:

  chain = "v4l2src device=/dev/video0 ! video/x-raw-yuv,width=320,height=240 ! \
           ffmpegcolorspace ! ffenc_flv ! fakesink name=video"

Получение видео из других источников

Далее приводятся примеры построения конвейеров gstreamer для различных источников видео.

Пример 1. Генерируем настроечную таблицу и кодируем видео кодеком Sorenson H.263

  {
    chain = "videotestsrc ! ffenc_flv ! fakesink name=video sync=true"
    name = "Пример 1"
  }

Пример 2. Добавляем к таблице цветов (см. пример 1) звуковой гудок, кодируемый кодеком Nellymoser.

  {
    chain = "videotestsrc ! ffenc_flv ! fakesink name=video sync=true \
             audiotestsrc ! ffenc_nellymoser ! fakesink name=audio sync=true"
    name = "Пример 2"
  }

Пример 3. Читаем видео из файла, применяем эффект "старой плёнки" (agingtv), кодируем. Для элемента agingtv требуется конвертация видео в другой формат цветового представления, используем для этого элементы ffmpegcolorspace.

  {
    chain = "uridecodebin uri=file:///home/user/video.avi !  \
             ffmpegcolorspace ! agingtv ! ffmpegcolorspace ! \
             ffenc_flv ! fakesink name=video sync=true"
    name = "Пример 3"
  }

Пример 4. Организуем скринкаст (транслируем картинку с экрана). Выполняем захват видео с экрана с частотой 15 кадров/сек и кодируем видеопоток кодеком "Screen Video".

  {
    chain =                                                               \
        "ximagesrc use-damage=false do-timestamp=true show-pointer=true ! \
         video/x-raw-rgb,framerate=15/1 !                                 \
         ffmpegcolorspace !                                               \
         ffenc_flashsv ! fakesink name=video"
    name = "Пример 4"
  }

Списки воспроизведения (плейлисты)

С помощью плейлистов можно организовать вещание видео из разных источников по расписанию. Плейлист представляет собой линейный список элементов воспроизведения. Каждый элемент содержит описание источника видео (URI, путь к файлу или конвейер gstreamer) и может сопровождаться атрибутами "начало", "конец", "длительность" и "начальное положение".

Плейлист описывается отдельным XML-файлом. Корневой тэг — <playlist>. Элементы плейлиста — теги <item>. В теге <item> должен содержаться один из следующих тегов:

uri — URI источника видео;

path — путь к видеофайлу;

chain — описание конвейера gstreamer.

Атрибуты тега <item>:

start — время/дата начала воспроизведения;

end — время/дата окончания воспроизведения;

duration — длительность воспроизведения. Значение — время или "full" (играть до конца файла). По умолчанию: "full";

seek — позиция начала воспроизведения. Перед началом показа видео будет перемотано в эту позицию.

Возможные форматы времени: СС, ММ:СС, ЧЧ::ММ:СС (C — секунды, М — минуты, Ч — часы). Форматы дат: мм/ДД, ГГГГ/ММ/ДД (Д — день, м — месяц, Г — год).

Пример файла плейлиста:

<playlist>
  <!-- Начинаем показ 27-го ноября в 12:00 -->
  <item start="11/27 12:00" end="13:00" seek="15">
    <path>/home/user/video/Movie.avi</path>
  </item>
  <item start="13:30" duration="15:00">
    <uri>rtsp://channel_one.com/live/stream.sdp</uri>
  </item>
  <item>
    <chain>
      videotestsrc ! ffenc_flv ! fakesink name=video sync=true
    </chain>
  </item>
</playlist>

Для задания потока с воспроизведением по плейлисту определяем параметр playlist, содержащий путь к файлу плейлиста:

mod_gst {
  streams {
    {
      name = "Онлайн-ТВ"
      playlist = "/opt/moment/playlist_tv.xml"
    }
  }
}

«Момент» позволяет обновлять плейлист и изменять позицию воспроизведения видеопотока во время работы через административные HTTP-запросы (методы POST или GET). Запрос для обновления плейлиста имеет следующий вид:

http://хост:порт/moment_admin/update_playlist или update_playlist_now/название_канала

Запрос update_playlist_now выполняет переключение на новый плейлист немедленно, прерывая воспроизведение текущего элемента. Запрос update_playlist даёт текущему элементу доиграть до конца. Пример URI для обновления плейлиста для канала "my_video":

http://localhost:8082/moment_admin/update_playlist_now/my_video

Запрос для установки позиции воспроизведения:

http://хост:порт/moment_admin/set_position/название_канала/номер либо id элемента/время

Пример URI для перемотки на позицию 1 час 45 мин первого элемента плейлиста для канала "video":

http://localhost:8082/moment_admin/set_position/video/1/1:45:00

Запись видео

«Момент» может записывать транслируемое видео на диск непрерывно или по расписанию в файлы формата flv.

Для непрерывной записи видео нужно задать в описании потока параметр record_path, содержащий путь к записываемым файлам:

  {
    name = "Поток 1"
    uri = "rtsp://91.200.224.242/mpeg4/media.amp"
    record_path = "/home/user/records/stream_1"
  }

Запись будет разделяться на отдельные файлы с суффиксом, содержащим дату и время начала записи: "_ГГГГ-мм-ДД_ЧЧ-ММ-СС.flv"

Для записи по расписанию используется плейлист такого же формата, как и для списков воспроизведения. Основное отличие — вместо источников видео в теге item задаётся параметр "id" с названием записываемого канала. Пример плейлиста для записи:

<playlist>
  <item start="12:00" duration="30" id="channel_one"/>
  <item duration="20" id="channel_two"/>
</playlist>

В конфигурационном файле запись по расписанию задаётся в секции mod_gst/recordings списком безымянных подсекций. В каждой подсекции определяются два параметра:

playlist — путь к файлу плейлиста;

record_path — путь к записываемым файлам.

Пример:

mod_gst {
  recordings {
    {
      playlist = "recording_playlist.xml"
      record_path = "/home/user/records/my_stream"
    }
  }
}


К содержанию