Gstreamer windows rtsp server

RTP and RTSP support

GStreamer has excellent support for both RTP and RTSP, and its RTP/RTSP stack has proved itself over years of being widely used in production use in a variety of mission-critical and low-latency scenarios, from small embedded devices to large-scale videoconferencing and command-and-control systems.

GStreamer RTSP Server

GStreamer’s RTSP server (gst-rtsp-server) is a featureful and easy-to-use library that allows applications to implement a complete RTSP server with just a couple of lines of code.

It is multi-threaded, scalable and flexible, and provides support for static or dynamic mount points, authentication, retransmission (rtx), encryption (srtp, secure RTP), UDP unicast and multicast as well as TCP interleaving, seeking, and optionally also cgroup integration for advanced resource management and control. It can also distribute a GStreamer net client clock to GStreamer RTSP clients to facilitate multi-device synchronization.

GStreamer RTSP Client

The GStreamer rtspsrc element from gst-plugins-good is GStreamer’s high-level RTSP client abstraction. It can be used as a standalone element directly, or can be used via playbin by passing an rtsp:// URI to playbin. rtspsrc features a number of GObject properties that allow you to configure it in all kinds of different ways, most notably a "latency" property to configure the default jitterbuffer latency, which you may want to configure to a lower value to achieve lower latency.

RTP components

Most of GStreamer’s key RTP components live in gst-plugins-good:

  • The rtpmanager plugin contains elements like rtpbin and rtpjitterbuffer
  • The rtp plugin contains RTP payloading and depayloading elements for many different codecs and container formats

with some lower-level libraries in gst-plugins-base:

  • The GStreamer RTP library contains things such as RTP payloader/depayloader base classes and functions to handle RTP and RTCP buffers
  • The GStreamer MIKEY library contains helper functions to deal with MIKEY messages for secure RTP
  • The GStreamer RTSP library contains low-level RTSP functionality used by gst-rtsp-server and higher-level objects such as rtspsrc.
  • The GStreamer SDP library contains utility functions for SDP message parsing and creation.

Some of the main components are:

  • rtpbin is the high-level RTP component and supports sending and receiving, just sending or just receiving data, with and without RTCP support. This is the bin that does it all: it adapts dynamically to your needs based on the requested pads; it also contains an rtpjitterbuffer.
  • rtpjitterbuffer is an RTP buffer that controls network jitter and reorders packets. It also dumps packets that arrive too late, handles packet retransmission and lost packet notification and adjusts for sender-receiver clock drift.
  • rtpptdemux is an element that usually sits on the rtpbin src pad and will detect any new payload types that arrive in the RTP stream. It will then create a pad for that new payload and you can connect a depayloader/decoder pipeline to that pad.
  • rtpssrcdemux is an element that usually sits on the rtpbin src pad and will detect any new SSRCs that arrive in the RTP stream. It will then create a pad for that new SSRC and you can connect a depayloader/decoder pipeline to that pad.
  • GstRTPBaseDepayload is a base class for RTP depayloaders
  • GstRTPBasePayload is a base class for RTP payloaders
  • GstRTPBaseAudioPayload is a base class for audio RTP payloaders

Note that many RTP elements assume they receive RTP buffers with GstNetAddressMeta meta data set on them (as udpsrc will produce).

Знакомство с GStreamer: Источники данных

Здравствуй, хабраюзер, интересующийся фреймворком GStreamer! Сегодня мы поговорим о источниках медиа-данных (sources), и тем самым продолжим курс статей посвященный GStreamer.

Читайте также:  Powershell оптимизация windows 10

Вступление


Источники данных — это класс плагинов GStreamer который позволяет читать медиаданные из различных источников, таких как файловая система или аудио-входы звуковой карты. Также, они позволяют получать медиапоток с различных серверов потокового вещания, такие как HTTP (ICECast, ShoutCast), RTSP, RTMP, TCP и UDP. А еще имеется возможность читать данные с DVB карт, CDDA-дисков (народе известных просто как «компакт-диски»), и еще много всего, при помощи различных плагинов, которых на данный момент около 30.
Примечание: как говорилось в прошлой статье, источники данных имеют только один pad с названием src, так как его можно подключить к другому элементу, но к нему подключить ничего нельзя.

В этой статье мы разберем некоторые (пожалуй, наиболее востребованные) источники данных, напишем немного кода на Python и узнаем много нового.

Поехали

0. gst-launch-1.0

Утилита gst-launch-1.0 позволяет запускать GStreamer pipeline без написания единой строчки кода. Я буду ее использовать для запуска небольших примеров, и что нам требуется знать сегодня — так это то, что запуск pipeline имеет примерно такой вид:

а описание pipeline, в свою очередь, делится на описание элементов вида

Вроде в этой схеме все понятно, есть элемент типа element1 с свойствами property1 и property2 которые имеют значения value1 и value2 соответственно, и есть элемент типа element2. Символ «!» указывает на то, что выход element1 необходимо соединить с входом element2.
На этом возможности gst-launch не ограничиваются, просто в сегодняшней статье они нам не пригодятся и будут рассмотрены в дальнейшем.

1. filesrc

filesrc — на мой взгляд, это самый часто используемый источник мультимедийных данных. Как можно понять из его названия, он является элементом для чтения данных из файлов. В прошлой статье мы рассматривали схему примитивного плеера, в котором фигурировал filesrc как источник данных.
Элемент filesrc имеет несколько параметров. Рассмотрим некоторые из них.

location

Свойство location должно содержать путь к файлу, из которого необходимо производить чтение.
Пример: /foo/bar.mp3

blocksize

Данный параметр устанавливает размер буфера чтения. Значение должно быть описано беззнаковым числом.

num-buffers

Количество блоков, после прочтения которых будет отправлено сообщение EOS.
Свойства blocksize и num-buffers можно не указывать. В этом случае будут использованы значения по умолчанию. А еще указанные свойства имеются у всех источников данных, и далее рассматриваться не будут.

Пример использования источника filesrc возьмем из предыдущей статьи:

2. souphttpsrc

Элемент souphttpsrc предоставляет возможность чтения данных поверх HTTP (HTTPS) протокола. Чтение может производиться как из обычного файла, доступного через HTTP протокол, так и с ICECast/ShoutCast сервера. Также данный элемент позволяет производить чтение данных поверх протоколов ICY и ICYX. По данным протоколам я никакой информации найти не смог.
souphttpsrc имеет чуть больше параметров чем filesrc, рассмотрим наиболее важные.

location

Данный параметр аналогичен одноименному параметру элемента filesrc, за исключением того, что поддерживаются только схемы URI http, https, icy или icyx.

user-agent

Название говорит само за себя — данный параметр устанавливает, какой использовать User-Agent при отправке HTTP-запросов.

automatic-redirect

Устанавливает автоматический переход в случае, если сервер ответил, что ресурс был перемещен (статусы 301 и 302).

user-id и user-pw

Данные свойства устанавливают имя пользователя и пароль, на случай, если ресурс требует авторизации (HTTP Basic Authentication).

proxy, proxy-id и proxy-pw

Данные свойства устанавливают адрес прокси сервера, имя пользователя и пароль для авторизации (если необходимо). Поддерживаются HTTP и HTTPS прокси.

Использование источника souphttpsrc, ничем не отличается от использования источника filesrc:

3. giosrc

В наборе плагинов GStreamer имеется интересный элемент giosrc. Это почти то же самое что и filesrc, только работает он через библиотеку GIO, и позволяет получать данные из различных источников с которыми может работать GIO. Таких источников 22, начиная от file, заканчивая mtp. Также, данный элемент поддерживает протоколы ftp, sftp, smb и webdav.
Данный элемент имеет параметры аналогичные элементу filesrc. Пример использования данного источника аналогичен использованию предыдущих:

Читайте также:  Почему не доступна вся озу windows 10
4. rtspsrc

Как можно понять из названия, данный элемент позволяет читать данные с RTSP сервера. Подробно рассматривать свойства данного элемента не будем, скажу только то, что он имеет свойство location для указания адреса источника данных, proxy, proxy-id и proxy-pw для указания настроек прокси, и с десяток свойств специфичных для RTSP протокола, рассмотрение которого не входит в наши планы.
Но, у rtspsrc есть одна особенность, у него несколько pad-ов, и имеют они названия подходящие под шаблон source_%u. Это связано с тем, что сервер может транслировать несколько потоков одновременно, например, аудио и видео могут быть разбросаны по двум потокам.
Примечание:
Я не знаком c протоколом RTSP, поэтому я мог ошибиться в предположении выше.

Пример использования rtspsrc аналогичен предыдущим элементам:

5. multifilesrc

Суть элемента multifilesrc такая же, как и у элемента filesrc — читать файлы с диска, но имеется одно отличие — multifilesrc читает файлы последовательно (1.mp3, 2.mp3. ), в то время как filesrc может читать только по одному файлу. У данного элемента есть один недостаток — имена файлов должны различаться только числом, например, file-1.mp3, file-2.mp3 и так далее. Но такой недостаток можно списать в разряд фич, так как с помощью данного «недостатка» можно с легкостью слепить из изображений 0000.png-9999.png видеоролик из фотографий, ну или мелодию из семплов, или микс из треков.
Элемент multifilesrc имеет немного параметров, и как ни странно — они все полезные. Рассмотрим их подробнее.

location

Путь к файлу может (и должен) включать в себя управляющую последовательность %d, которая будет автоматически заменена с помощью функции sprintf() на число равное текущему индексу.
Пример: /foo/bar-%04d.mp3

index, start-index и stop-index

Данные свойства содержат в себе текущий индекс, стартовый индекс, и финальный индекс. Данные свойства содержат целочисленное число.

Данное свойство может содержать булево значение, и в случае если оно равно true — чтение файлов будет зациклено. Грубо говоря, это аналог функции «Repeat All».

Пример использования элемента multifilesrc который читает файлы с именами начиная от bar-1.mp3 с включенной опцией loop:

6. fdsrc

На мой взгляд, самый бесполезный элемент. Читает данные из файлового дескриптора. Может применяться когда лень описывать filesrc для gst-launch.
Данный элемент имеет один параметр:

Данный параметр должен содержать число, равное открытому файловому дескриптору. По умолчанию равняется нулю.

7. fakesrc

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

8. alsasrc, pulsesrc, osssrc, jackaudiosrc, autoaudiosrc

Данные элементы предназначены для получения потока с микрофонного входа звуковой карты. Из названий следует, что они используются для работы с различными звуковыми подсистемами, такими, как Alsa, PulseAudio, OSS, Jack. Элемент autoaudiosrc является «оберткой» над остальными элементами, и упрощает разработку, забирая на свои плечи всю работу по выбору источника звука.
Свойств у данных элементов не очень много. Основным свойством является device, оно присутствует в первых трех элементах и должно содержать название девайса (hw:0, hw:1. ). Остальные свойства используются специфичны для каждой звуковой подсистемы, и рассматривать мы их не будем.

9. v4l2src

Этот элемент предназначен для открытия видеопотока через интерфейс Video4Linux2. Интерфейс V4L2 поддерживает большинство веб-камер, ТВ-тюнеры, DVB-карточки и карточки видеозахвата.
Рассмотрим наиболее важные параметры:

device

Указывает имя устройства с которого нужно производить захват. Узнать список доступных устройств можно с помощью

Читайте также:  Как windows работает с процессами

В качестве значения этого параметра должен быть указан полный путь к устройству.
Пример: device=/dev/video0

hue, saturation, contrast. brightness

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

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

10. audiotestsrc

Этот элемент аналогичен элементу fakesrc, но отличается тем, что генерирует реальный аудиосигнал. Его можно использовать как для тестирования сложных pipeline запущенных посредством gst-launch, для тестирования работоспособности pipeline в написанном приложении, а также его можно использовать как эталонный генератор для измерения АЧХ и искажений которые вносят разнообразные фильтры.
Рассмотрим наиболее интересные параметры данного элемента.

Данный параметр устанавливает форму сигнала. Доступно 13 значений: sine, square, saw, triangle, silence, white-noise, pink-noise, sine-table, ticks, gaussian-noise, red-noise, blue-noise, violet-noise.

volume

Не сложно догадаться, что этот параметр устанавливает уровень сигнала (громкость). Допустимые значения располагаются в диапазоне от 0 до 1.

Это свойство устанавливает частоту сигнала, и значение может располагаться в диапазоне от 0 до 20000.

Пример использования элемента audiotestsrc:

11. videotestsrc

Этот элемент, как и audiotestsrc, используется для генерации тестовых данных, а именно, видеопотока. Его можно использовать как для проверки работоспособности всего pipeline, или же для проверки на наличие искажений которые вносятся фильтрами.
Параметров у этого элемента очень много, рассмотрим мы только один, самый интересный на мой взгляд.

pattern

Данный параметр устанавливает шаблон видеосигнала. Допустимым значением может быть одно из 21. Полный список: smpte, snow, black, white, red, green, blue, checkers-1, checkers-2, checkers-4, checkers-8, circular, blink, smpte75, zone-plate, gamut, chroma-zone-plate, solid-color, ball, smpte100, bar.
На всех значениях останавливаться не буду, скажу только то, что значения smpte, smpte75 и smpte100 — это настроечные таблицы SMPTE которые применяются в настройках теле/видео-аппаратуры. Шаблоны checkers-* — это сетка NxN пикселей, где N равняется числу в имени шаблона. Остальные же значения устанавливают шаблон с монотонным изображением, например заливку цветом.

Пояснения

Выше мы рассмотрели 15 основных источников данных, это где-то половина от всех имеющихся плагинов из категории source. Остальные плагины не были рассмотрены по двум причинам:

  • Они узкоспециализированные;
  • У меня отсутствуют необходимые «железки» для проверки того или иного плагина.

При рассмотрении плагинов были опущены многие параметры, так как в основном все они используются для «тонкой настройки», а у нас, как вы помните, идет знакомство с GStreamer. Или же данные параметры доступны только для чтения. Чтобы получить список всех доступных свойств, а так же допустимые для них значения, достаточно выполнить gst-inspect-1.0 , например:

и в секции «Element Properties» вы можете наблюдать все свойства (в том числе и унаследованные).

Примеры

Сегодня мы рассмотрим один простой пример использования GStreamer. В примере я буду использовать Python 2.7, GStreamer 1.0 и GObject Introspection.
Сразу оговорюсь, код может быть не идеальным, и может быть даже так называемым «говнокодом», но его единственное назначение показать, как использовать GStreamer, не более.

Простой плеер

Примеры запуска этого скрипта:

В случае, если все пойдет как нужно — вы услышите нужный вам трек и увидите список ID3 тегов, если таковые имеются.
Пример доступен на GitHub.

Ну вот и все

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

Литература

UPD 1: Добавлены элементы audiotestsrc, videotestsrc.

Оцените статью