В этом разделе описывается синтаксис конфигурационных файлов видеосервера и приводится список доступных параметров конфигурации.
Основной конфигурационный файл
По умолчанию основной конфигурационный файл видеосервера — /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. Каждый видеопоток описывается отдельной безымянной секцией. Существует три варианта задания источника видео:
- Через URI источника;
- Описанием конвейера gstreamer;
- Списком воспроизведения (плейлистом).
Параметры описания источника видео, общие для всех способов:
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 отображает видео на экране в отдельном окне.
Для того, чтобы «Момент» мог использовать конвейер для получения видео, должны быть соблюдены следующие условия:
- Цепочка обработки видео должна заканчиваться элементом fakesink с именем "video" (параметр name="video") и параметром sync=true;
- Цепочка обработки звука должна заканчиваться элементом fakesink с именем "audio" (параметр name="audio") и параметром sync=true;
- Видео и аудио, попадающее в элементы 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"
Получение видео из других источников
Пример 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" } } }
К содержанию