Управление цепочками GStreamer — различия между версиями

Материал из virt2real wiki
Перейти к: навигация, поиск
 
Строка 208: Строка 208:
  
  
=Дополнительные ссылки=
 
  
[https://github.com/RidgeRun/gstd/wiki/Command-line-examples https://github.com/RidgeRun/gstd/wiki/Command-line-examples]
+
=Пример использования=
  
[https://developer.ridgerun.com/wiki/index.php/Gstreamer_daemon_usage https://developer.ridgerun.com/wiki/index.php/Gstreamer_daemon_usage]
+
[[Динамическое изменение битрейта]]
  
  
  
=Пример использования=
+
=Дополнительные ссылки=
  
[[Динамическое изменение битрейта]]
+
[https://github.com/RidgeRun/gstd/wiki/Command-line-examples https://github.com/RidgeRun/gstd/wiki/Command-line-examples]
 +
 
 +
[https://developer.ridgerun.com/wiki/index.php/Gstreamer_daemon_usage https://developer.ridgerun.com/wiki/index.php/Gstreamer_daemon_usage]
  
  
  
 
[[Категория:Инструкции]]
 
[[Категория:Инструкции]]

Текущая версия на 14:01, 16 ноября 2014

Содержание

Вступление

Использование GStreamer для трансляции аудио/видео в обычном виде, т.е. запуск требуемой цепочки, имеет ряд неудобств - запуск GStreamer занимает несколько секунд, что не всегда является комфортным. А на лету изменить какой-либо параметр запущенной цепочки не представляется возможным.

Пример - управление ездящей тележой с камерой. За приём команд с управляющего устройства (смартфон, планшет, ПК и т.д.) отвечает какой-то скрипт или скомпилированное приложение (сервер команд). За трансляцию видео отвечает GStreamer. При подключении клиента сервер команд определяет с какого IP произошло подключения и должен направить видеопоток на этот IP. Порт может быть фиксированным или случайным. При обычном подходе сервер команд может при каждом подключении клиента убивать текущий процесс GStreamer и запускать его заново, с указанием требуемого IP приёмника. В таком случае перезапуск видео может занимать несколько секунд, что не всегда удобно.

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

Мы уже собирались писать собственное приложение для управления цепочкой udpsink, но при гуглении оказалось что такое приложение уже есть и позволяет делать всё что нужно (и даже больше).

Итак, встречаем героя дня - gstd (GStreamer Daemon).

https://github.com/RidgeRun/gstd


  • Позволяет на лету создавать цепочки GStreamer, менять любые доступные параметры любого элемента цепочки, запускать цепочку, ставить на паузу, удалять и т.д.
  • Написан на языке Vala (транслируется в Си, после чего компилируется обычным способом). На таргете (т.е. в файловой системе Виртурилки) Vala не требуется, требуется на хосте, только при сборке
  • Управление демоном производится через D-bus из приложения gst-client (идёт в комплекте) или из любого другого приложения, умеющего работать с D-bus


Установка сервера

На прошивках, выложенных после 02.03.2014 сервер gstd имеется в составе файловой системы. На более ранних версиях прошивкой сервер gstd можно установить из репозитория

opkg-cl update
opkg-cl install gstd

Помимо gstd будут автоматически установлены d-bus, expat и конфигурационный файл gstd для D-bus.


Запуск сервера

Так как передача команд управления сервером происходит через D-bus, сначала надо запустить его.

Обычно это делается это командой

dbus-daemon --system &

Но в прошивке Виртурилки он стартует скриптом автозапуска, скрипт называется

/etc/init.d/S30dbus

После этого можно запускать gstd. Обычно он запускается командой

nice -n -20 gstd --system &

Но в прошивке Виртурилки, опять же, он имеется в автозапуске. Скрипт называется

/etc/init.d/S31gstd

Управление цепочками

Важное преимущество такого способа управления цепочками - все операции можно производить "на лету", без останова трансляции. Т.е. если шла трансляция видео, например, на хост 192.168.1.20 а нам надо перекинуть его на 192.168.1.10 - достаточно лишь изменить соответствующий параметр и поток сразу пойдёт на указанный адрес.


Создание цепочки

Создание цепочки производится утилитой gst-client.

Формат запуска:

gst-client create "цепочка"

После запуска демона gstd можно создать какую-нибудь цепочку. Для примера возьмём нашу обычную цепочку трансляции видео по RTP. Однако, потребуются небольшие изменения. Для элемента где указываются формат видео необходимо явно добавить "capsfilter caps=". А сам перечень параметров в этом элементе требуется указывать без пробелов. Апострофы и кавычки также необходимо убрать.

gst-client create "v4l2src always-copy=false chain-ipipe=true ! capsfilter caps=video/x-raw-yuv,format=(fourcc)NV12,width=640,height=480,framerate=(fraction)25/1 ! \ 
queue ! dmaiaccel ! dmaienc_h264 ddrbuf=true encodingpreset=2 ratecontrol=2 intraframeinterval=5 idrinterval=50 targetbitrate=1000000 ! \
rtph264pay ! udpsink port=3000 host=127.0.0.1 enable-last-buffer=false sync=false"

В результате выполнения этой команды увидим в консоли что-то вроде

Parse single command interactive:
Pipeline path created: /com/ridgerun/gstreamer/gstd/pipe0
Ok.

Это означает что цепочка создана, ей присвоено имя "/com/ridgerun/gstreamer/gstd/pipe0" (а номер цепочки, соответственно, 0).

После создания цепочка находится в состоянии паузы, т.е. неактивна.

Как можно заметить, данная цепочка бесполезна, т.е. будет транслировать видео на хост 127.0.0.1.

Изменение цепочки

Теперь изменим адрес трансляции видео.

Для запуска трансляции на хост, допустим, 192.168.1.10, надо изменить параметр host элемента udpsink.

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

Так что для изменения элемента udpsink нам надо указывать имя udpsink0.

Формат команды:

gst-client set <имя_элемента> <имя_параметра> <тип_данных> <значение>

Изменяем

gst-client -p 0 set udpsink0 host string 192.168.1.10

В консоли увидим что-то вроде

Parse single command interactive:
Trying to set 'host' on element 'udpsink0' to the value:192.168.1.10
Ok.


Запуск цепочки

Формат команды:

gst-client set -p <номер_цепочки> <состояние>

Запускаем цепочку

gst-client -p 0 play

В консоли увидим что-то вроде

Parse single command interactive:
Ok.


Пауза цепочки

Формат команды:

gst-client set -p <номер_цепочки> <состояние>

Запускаем цепочку

gst-client -p 0 pause

В консоли увидим что-то вроде

Parse single command interactive:
Ok.


Полный список команд

Получение списка команд

Для получения справки о командах сервера gstd надо выполнить команду

gst-client help
This is the list of supported commands:
 create:        Creates a new pipeline and returns the dbus-path to access it
 destroy:       Destroys the pipeline specified by_path(-p) or the active pipeline
 destroy-all:   Destroys all pipelines on the factory.
 play:          Sets the pipeline specified by_path(-p) or the active pipeline to play state
 ready:         Sets the pipeline specified by_path(-p) or the active pipeline to ready state
 pause:         Sets the pipeline specified by_path(-p) or the active pipeline to pause state
 null:          Sets the pipeline specified by_path(-p) or active pipeline to null state
 aplay:         Sets the pipeline to play state, it does not wait the change to be done
 aready:        Sets the pipeline to ready state, it does not wait the change to be done
 apause:        Sets the pipeline to pause state, it does not wait the change to be done
 anull:         Sets the pipeline to null state, it does not wait the change to be done
 set:           Sets an element's property value of the pipeline
                Supported <data-type>s include: boolean, integer, int64, double and string
 get:           Gets an element's property value of the pipeline
 get-duration:  Gets the pipeline duration time
 get-position:  Gets the pipeline position
 sh:            Execute a shell command using interactive console
 get-state:     Get the state of a specific pipeline(-p flag) or the active pipeline
 get-elem-state:        Get the state of a specific element ofthe active pipeline
 list-pipes:    Returns a list of all the dbus-path ofthe existing pipelines
 ping:          Shows if gstd is alive
 ping-pipe:     Test if the active pipeline is alive
 active:        Sets the active pipeline,if no <path> is passed:it returns the actual active pipeline
 seek:          Moves current playing position to a new one
 skip:          Skips a period, if period is positive: it moves forward, if negative: it moves backward
 speed:         Changes playback rate:
                * rate>1.0: fast-forward playback,
                * rate<1.0: slow-forward playback,
                * rate=1.0: normal speed.
                Negative rate causes reverse playback.
 step:          Step the number of frames, if no number is provided, 1 is assumed
 send-eos:      Send an EOS event on the pipeline
 send-custom-event:     Send a custom event on the pipeline. The event type can be:
                * UPSTREAM
                * DOWNSTREAM
                * DOWNSTREAM_OOB
                * BOTH
                * BOTH_OOB

 element-set-state:     Sets the element state          Supported <state>s include: null, ready, paused, playing
 element-async-set-state:       Sets the element state, it does not wait the change to be done
 exit:          Exit/quit active console
 quit:          Exit/quit active console
 strict:        Enable/disable strict execution mode.
 version:       Show gst-client version.


Получение формата команды

Для получения информации о формате конкретной команды надо выполнить

gst-client help <команда>

Например, для команды "set"

gst-client help set
Parse single command interactive:
Command: set
Description:    Sets an element's property value of the pipeline
                Supported <data-type>s include: boolean, integer, int64, double and string
Syntax: set <element_name> <property_name> <data-type> <value>


Пример использования

Динамическое изменение битрейта


Дополнительные ссылки

https://github.com/RidgeRun/gstd/wiki/Command-line-examples

https://developer.ridgerun.com/wiki/index.php/Gstreamer_daemon_usage