SlideShare a Scribd company logo
GStreamer
Кратко обо мне.
● Разработчик одного из подразделений ITransition.
● Четко выраженной сферы интересов нет, по возможности
использую весь багаж знаний полученный в альма-матер, и
расширяемый за последние 10 лет – сетевые протоколы,
микропроцессорные архитектуры, внутренние механизмы
операционных систем, обработка изображений.
● На данный момент занимаюсь разработкой сервера системы
видеонаблюдения на базе платформы iMX6.
● Ну и конечно же C/C++ 
Gstreamer: что это?
● Фреймворк, для построения мультимедийных приложений.
● GStreamer написан на языке C, с использованием ООП-
парадигмы, которая реализована на базе GObject.
● Приложение строится путем объединения элементарных
строительных блоков – элементов, в цепочку, которая образует
путь следования данных – pipeline.
Сравните
● Linux Pipeline:
● grep 'Starting' /var/log/boot.log |
sort > recently-started.txt
● Gstreamer pipeline:
● gst-launch-1.0 filesrc
location='movie.mkv' ! matroskademux
! avdec_h264 ! avenc_mpeg2video !
filesink location='videostream.mp4'
GStreamer:пример использования
GStreamer:пример использования
rtspsrc tee
rtph264
depay
h264parse
queue splitmuxsink
queue appsink
SD-card
appsrc h264dec videoconvert motiondetection
Remote
storage
WebRTC
Аналоги: ffmpeg
По набору предоставляемых возможностей и возможным областям применения,
наиболее близким аналогом является ffmpeg. Однако они отличаются
«философией» написания приложения.
ffmpeg - Доменные сущности (файлы, потоки, кодеки) представляются
разработчику в виде контекстов, для работы с контекстами используется
предоставляемый API.
GStreamer – разработчику предоставляется набор функционально законченных
элементов, которые комбинируются и объединяются, образуя путь следования
данных в порядке их обработки.
На мой взгляд, основная сложность использования ffmpeg для обработки медиа-
данных – это необходимость «ручной» синхронизации потоков к единой шкале
времени.
GStreamer скрывает детали синхронизации времени, кроме того, обеспечивает
механизм согласования форматов данных. Модульная архитектура способствует
разработке элементов, поддерживающих аппаратные ускорители.
GStreamer: возможности
● Принимать и передавать аудио/видео данные, используя
протоколы HTTP, RTSP/RTP и др.
● Разбирать и собирать потоки в разных форматах
(контейнерах): MPEG, AVI, ASF, FLV, MKV и др.
● Декодировать/кодировать потоки в различных комбинациях
кодеков (в том числе можно задействовать и аппаратные
ресурсы, реализующие необходимый алгоритм)
● Получать потоки данных из различных источников и
отправлять их (потоки данных) в различные приемники
Компоненты
● Набор плагинов, поставляемых в виде динамических
библиотек.
● Утилиты командной строки, предназначенные для
запуска pipelin'а, перечисления списка имеющихся
элементов и их свойств (gst-launch, gst-inspect).
Gstreamer: инструментарий
● Уже упомянутые утилиты командной строки: gst-
launch, gst-inspect
● Возможность визуализации pipeline в формат graphviz.
● Основным WYSIWYG-построителем является
GStreamer Pipeline Editor.
● Система логирования с широким диапазоном log-level
Строительные блоки: элементы
● Элементы являются минимальными строительными
блоками. 5 категорий:
– Источники данных
– Фильтры
– Приемники данных
– Анализаторы потока
– Вспомогательные элементы
Строительные блоки: элементы
● Любой элемент является конечным автоматом, в течение
времени функционирования приложения переходя из одного
состояния в другое.
● В соответствии с философией GLib элементы имеют
именованные свойства.
● Для соединения элементов в цепочку используются точки
подключения, т.н. pads:
– sinkpad – вход потока данных в элемент
– srcpad – вывод потока данных из элемента
У элемента может быть несколько точек подключения.
Элементы: источники
● Источники – это класс плагинов, которые
позволяют читать медиаданные из различных
источников:
– Filesystem (filesrc, multifilesrc)
– Network (souphttpsrc, rtspsrc, udpsrc)
– Devices (alsasrc, v4l2src)
– Others (fakesrc, audiotestsrc, videotestsrc)
Элементы: приемники
● Приемники – это оконечные элементы pipeline,
они “выводят медиаданные” за его пределы.
– Filesystem (filesink, multifilesink)
– X-server (ximagesink, xvimagesink)
– Network (udpsink)
Элементы: фильтры
● Фильтры – это элементы, которые выполняют
различные преобразования над потоком данных. Это,
пожалуй, самый обширный класс элементов, который
объединяет мультиплексоры/демультиплексоры
потоков, парсеры, кодеры/декодеры и многое другое.
Элементы: прочие элементы
● Анализаторы потока – элементы этой категории
пропускают через себя поток данных, не
модифицируя его, но изменняют свое состояние
и/или генерируют событие.
● Вспомогательные элементы – к этой категории
относятся очереди, “разветвители” потока
данных и некоторые другие элементы.
Элемент: конечный-автомат
● Состояния элемента в течение времени жизни:
– NULL – элемент неактивен и не владеет никакими
ресурсами
– READY – элементу предоставлена часть ресурсов, не
относящихся напрямую к обработке потока данных
(динамические библиотеки, ресурсы аппаратуры)
– PAUSED – элемент готов принимать и обрабатывать потоки
данных
– PLAYING – элемент обрабатывает поток данных
Элемент: конечный автомат
● Диаграмма переходов
NULL READY PAUSED PLAYING
Строительные блоки: контейнеры
● Контейнеры представляют собой особую
категорию элементов.
● Контейнеры объединяют несколько элементов,
позволяя управлять ими одновременно
(например, изменять состояние)
Контейнеры
Контейнеры
Pipeline: пример
Pipeline: пример
gst-launch-1.0 filesrc location='movie.mkv'
! matroskademux name=d
! queue ! avdec_h264 ! xvimagesink
d. ! queue ! avdec_mp3 ! alsasink
Взаимодействие элементов
● Для взаимодействия элементов между собой и с
приложением верхнего уровня используются
следующие сущности:
– Pad
– Bus
– Buffers
– Events
– Messages
– Query
Взаимодействие элементов
Gstreamer: пишем код
void Recorder::init_pipeline() {
std::string pipeline(“rtspsrc name=src ! rtph264_depay ! H264parse ! tee name=t”
“ t. ! queue ! appsink name=h264sink “
“ t. ! queue ! splitmuxsink max-size-time=90000000000 muxer=qtmux“);
_pipeline = gst_parse_launch(pipeline.c_str(), NULL);
_rtspsrc = gst_bin_get_by_name(GST_BIN(_pipeline), “src”);
_h264sink = gst_bin_get_by_name(GST_BIN(_pipeline), “h264sink”);
g_object_set(_h264sink, “emit-signals”, TRUE, NULL);
_new_sample_id = g_signal_connect(_h264sink, “new-sample”,
G_CALLBACK(new_sample), this);
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(_pipeline));
_bus_watch_id = gst_bus_add_watch(bus, on_bus_message, this);
g_object_unref(bus);
}
Gstreamer: пишем код
GstFlowReturn Recorder::new_sample(GstElement *element, gpointer userdata) {
Recorder *recorder = static_cast<Recorder*>(userdata);
GstSample *sample = NULL;
g_signal_emit_by_name(element, “pull-sample”, &sample);
if (sample) {
if (element == recorder->_appsink)
recorder->_detector.push_sample(sample);
gst_sample_unref(sample);
}
return GST_FLOW_OK;
}
Gstreamer: пишем код
gboolean Recorder::on_bus_message(GstBus *bus, GstMessage *msg, gpointer userdata) {
Recorder *recorder = static_cast<Recorder*>(userdata);
switch (GST_MESSAGE_TYPE(msg)) {
case GST_MESSAGE_ERROR:
recorder->on_message_error(msg);
break;
case GST_MESSAGE_EOS:
recorder->on_message_eos(msg);
break;
case GST_MESSAGE_STATE_CHANGED:
recorder->on_message_state_changed(msg);
break;
default:
recorder->on_message_other(msg);
}
return TRUE;
}
GStreamer: пишем код
void Recorder::start() {
GstStateChangeReturn ret = gst_element_set_state(_pipeline, GST_STATE_PLAYING);
_detector.start();
}
void Recorder::stop() {
_detector.stop();
GstStateChangeReturn ret = gst_element_set_state(_pipeline, GST_STATE_NULL);
}
GStreamer: пишем код
void Detector::init_pipeline() {
std::string pipeline(“appsrc ! ”
#if defined BUILD_PROFILE_IMX
“ vpudec ! imxvideoconvert_g2d ! capsfilter caps=”video/x-raw,width=640,height=480” !
videoconvert ! ”
#elif defined BUILD_PROFILE_PC
“ avdec_h264 ! videoconvert ! videoscale ! capsfilter caps=”video/x-
raw,width=640,height=480, format=RGB” ! ”
#else
#error “Undefined build profile”
#endif
“ motioncells name=mdcells display=FALSE gridx=32 gridy=32 ! videorate name=vrate “);
_pipeline = gst_parse_launch(pipeline.c_str(), NULL);
GStreamer: пишем код
_mdcells = gst_bin_get_by_name(GST_BIN(_pipeline), “mdcells”);
_vrate = gst_bin_get_by_name(GST_BIN(_pipeline), “vrate”);
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(_pipeline));
_bus_watch_id = gst_bus_add_watch(bus, on_bus_message, this);
g_object_unref(bus);
}
Gstreamer: пишем код
gboolean Detector::on_bus_message(GstBus *bus, GstMessage *msg, gpointer userdata)
{
Detector *detector = static_cast<Detector*>(userdata);
if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ELEMENT
&& GST_MESSAGE_SRC(msg) == _mdcells) {
const GstStructure *msg_struct = gst_message_get_structure(msg);
if (gst_structure_has_name(msg_struct, “motion”) {
if (gst_structure_has_field(msg_struct, “motion_begin”)
_recorder.start_recording();
else if (gst_structure_has_field(msg_struct, “motion_finished”)
_recorder.stop_recording();
}
}
return TRUE;
}
GStreamer: итоги
Подводя итоги, я хочу отметить некоторые достоинства и
недостатки фреймворка:
● Достоинства
– Возможность быстрого прототипирования сложных схем
обработки аудио/видеоданных
– Модульная архитектура
– Поддержка широкого спектра устройств ввода-вывода
● Недостатки
– Написан на C
– Далеко не все элементы качественно реализованы

More Related Content

What's hot

Mpls technology
Mpls technologyMpls technology
Mpls technology
Naveen Sihag
 
Bluetooth
BluetoothBluetooth
Bluetooth
Raju Kunde
 
Tradycyjne techniki druku
Tradycyjne techniki drukuTradycyjne techniki druku
Tradycyjne techniki druku
Aleksandra Kłos
 
Senai recife
Senai   recifeSenai   recife
Senai recife
Carlos Melo
 
Newsgroups
NewsgroupsNewsgroups
Newsgroups
formandoeisnt
 
Introduction to VoIP, RTP and SIP
Introduction to VoIP, RTP and SIP Introduction to VoIP, RTP and SIP
Introduction to VoIP, RTP and SIP
ThousandEyes
 
Aula de Sistemas Distribuídos - Padrões de Projeto de Middleware
Aula de Sistemas Distribuídos - Padrões de Projeto de MiddlewareAula de Sistemas Distribuídos - Padrões de Projeto de Middleware
Aula de Sistemas Distribuídos - Padrões de Projeto de Middleware
Victor Hazin da Rocha
 
Introduction to Diameter Protocol - Part1
Introduction to Diameter Protocol - Part1Introduction to Diameter Protocol - Part1
Introduction to Diameter Protocol - Part1
Basim Aly (JNCIP-SP, JNCIP-ENT)
 
Apostila Redes
Apostila RedesApostila Redes
sigtran
sigtransigtran
sigtran
krsgowri
 

What's hot (10)

Mpls technology
Mpls technologyMpls technology
Mpls technology
 
Bluetooth
BluetoothBluetooth
Bluetooth
 
Tradycyjne techniki druku
Tradycyjne techniki drukuTradycyjne techniki druku
Tradycyjne techniki druku
 
Senai recife
Senai   recifeSenai   recife
Senai recife
 
Newsgroups
NewsgroupsNewsgroups
Newsgroups
 
Introduction to VoIP, RTP and SIP
Introduction to VoIP, RTP and SIP Introduction to VoIP, RTP and SIP
Introduction to VoIP, RTP and SIP
 
Aula de Sistemas Distribuídos - Padrões de Projeto de Middleware
Aula de Sistemas Distribuídos - Padrões de Projeto de MiddlewareAula de Sistemas Distribuídos - Padrões de Projeto de Middleware
Aula de Sistemas Distribuídos - Padrões de Projeto de Middleware
 
Introduction to Diameter Protocol - Part1
Introduction to Diameter Protocol - Part1Introduction to Diameter Protocol - Part1
Introduction to Diameter Protocol - Part1
 
Apostila Redes
Apostila RedesApostila Redes
Apostila Redes
 
sigtran
sigtransigtran
sigtran
 

Similar to Применение фреймворка GStreamer в системе видеонаблюдения

мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на python
Slach
 
Программируемость коммутаторов для ЦОД Cisco Nexus
Программируемость коммутаторов для ЦОД Cisco NexusПрограммируемость коммутаторов для ЦОД Cisco Nexus
Программируемость коммутаторов для ЦОД Cisco Nexus
Cisco Russia
 
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейПакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Cisco Russia
 
вебинар взаимодействие Info watch traffic monitor c субд oracle
вебинар   взаимодействие  Info watch traffic monitor c субд oracleвебинар   взаимодействие  Info watch traffic monitor c субд oracle
вебинар взаимодействие Info watch traffic monitor c субд oracleIW_test
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Ontico
 
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Mail.ru Group
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Yandex
 
Git for you
Git for youGit for you
Git for you
Pavel Alexeev
 
Hl2008 Spy Log Architechture 169
Hl2008 Spy Log Architechture 169Hl2008 Spy Log Architechture 169
Hl2008 Spy Log Architechture 169Media Gorod
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Yandex
 
Перевод новостного приложения на БД PostgreSQL
Перевод новостного приложения на БД PostgreSQLПеревод новостного приложения на БД PostgreSQL
Перевод новостного приложения на БД PostgreSQL
Dmitry Kremer
 
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
DevGAMM Conference
 
New SpyLOG architechture (Highload 2008)
New SpyLOG architechture (Highload 2008)New SpyLOG architechture (Highload 2008)
New SpyLOG architechture (Highload 2008)
Sergey Skvortsov
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
Platonov Sergey
 
StackLight (aka LMA)
StackLight (aka LMA)StackLight (aka LMA)
StackLight (aka LMA)
OpenStackRussia
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Sergey Platonov
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Ontico
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Anton Baranov
 
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центр
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центрМониторинг веб-проектов: штаб оперативного реагирования и аналитический центр
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центрsportgid
 

Similar to Применение фреймворка GStreamer в системе видеонаблюдения (20)

мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на python
 
Программируемость коммутаторов для ЦОД Cisco Nexus
Программируемость коммутаторов для ЦОД Cisco NexusПрограммируемость коммутаторов для ЦОД Cisco Nexus
Программируемость коммутаторов для ЦОД Cisco Nexus
 
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейПакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
 
вебинар взаимодействие Info watch traffic monitor c субд oracle
вебинар   взаимодействие  Info watch traffic monitor c субд oracleвебинар   взаимодействие  Info watch traffic monitor c субд oracle
вебинар взаимодействие Info watch traffic monitor c субд oracle
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Git for you
Git for youGit for you
Git for you
 
Hl2008 Spy Log Architechture 169
Hl2008 Spy Log Architechture 169Hl2008 Spy Log Architechture 169
Hl2008 Spy Log Architechture 169
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Перевод новостного приложения на БД PostgreSQL
Перевод новостного приложения на БД PostgreSQLПеревод новостного приложения на БД PostgreSQL
Перевод новостного приложения на БД PostgreSQL
 
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
 
New SpyLOG architechture (Highload 2008)
New SpyLOG architechture (Highload 2008)New SpyLOG architechture (Highload 2008)
New SpyLOG architechture (Highload 2008)
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
StackLight (aka LMA)
StackLight (aka LMA)StackLight (aka LMA)
StackLight (aka LMA)
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
 
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центр
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центрМониторинг веб-проектов: штаб оперативного реагирования и аналитический центр
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центр
 
The Best Portlet
The Best PortletThe Best Portlet
The Best Portlet
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
corehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
corehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
corehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
corehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
corehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

Применение фреймворка GStreamer в системе видеонаблюдения

  • 2. Кратко обо мне. ● Разработчик одного из подразделений ITransition. ● Четко выраженной сферы интересов нет, по возможности использую весь багаж знаний полученный в альма-матер, и расширяемый за последние 10 лет – сетевые протоколы, микропроцессорные архитектуры, внутренние механизмы операционных систем, обработка изображений. ● На данный момент занимаюсь разработкой сервера системы видеонаблюдения на базе платформы iMX6. ● Ну и конечно же C/C++ 
  • 3. Gstreamer: что это? ● Фреймворк, для построения мультимедийных приложений. ● GStreamer написан на языке C, с использованием ООП- парадигмы, которая реализована на базе GObject. ● Приложение строится путем объединения элементарных строительных блоков – элементов, в цепочку, которая образует путь следования данных – pipeline.
  • 4. Сравните ● Linux Pipeline: ● grep 'Starting' /var/log/boot.log | sort > recently-started.txt ● Gstreamer pipeline: ● gst-launch-1.0 filesrc location='movie.mkv' ! matroskademux ! avdec_h264 ! avenc_mpeg2video ! filesink location='videostream.mp4'
  • 6. GStreamer:пример использования rtspsrc tee rtph264 depay h264parse queue splitmuxsink queue appsink SD-card appsrc h264dec videoconvert motiondetection Remote storage WebRTC
  • 7. Аналоги: ffmpeg По набору предоставляемых возможностей и возможным областям применения, наиболее близким аналогом является ffmpeg. Однако они отличаются «философией» написания приложения. ffmpeg - Доменные сущности (файлы, потоки, кодеки) представляются разработчику в виде контекстов, для работы с контекстами используется предоставляемый API. GStreamer – разработчику предоставляется набор функционально законченных элементов, которые комбинируются и объединяются, образуя путь следования данных в порядке их обработки. На мой взгляд, основная сложность использования ffmpeg для обработки медиа- данных – это необходимость «ручной» синхронизации потоков к единой шкале времени. GStreamer скрывает детали синхронизации времени, кроме того, обеспечивает механизм согласования форматов данных. Модульная архитектура способствует разработке элементов, поддерживающих аппаратные ускорители.
  • 8. GStreamer: возможности ● Принимать и передавать аудио/видео данные, используя протоколы HTTP, RTSP/RTP и др. ● Разбирать и собирать потоки в разных форматах (контейнерах): MPEG, AVI, ASF, FLV, MKV и др. ● Декодировать/кодировать потоки в различных комбинациях кодеков (в том числе можно задействовать и аппаратные ресурсы, реализующие необходимый алгоритм) ● Получать потоки данных из различных источников и отправлять их (потоки данных) в различные приемники
  • 9. Компоненты ● Набор плагинов, поставляемых в виде динамических библиотек. ● Утилиты командной строки, предназначенные для запуска pipelin'а, перечисления списка имеющихся элементов и их свойств (gst-launch, gst-inspect).
  • 10. Gstreamer: инструментарий ● Уже упомянутые утилиты командной строки: gst- launch, gst-inspect ● Возможность визуализации pipeline в формат graphviz. ● Основным WYSIWYG-построителем является GStreamer Pipeline Editor. ● Система логирования с широким диапазоном log-level
  • 11. Строительные блоки: элементы ● Элементы являются минимальными строительными блоками. 5 категорий: – Источники данных – Фильтры – Приемники данных – Анализаторы потока – Вспомогательные элементы
  • 12. Строительные блоки: элементы ● Любой элемент является конечным автоматом, в течение времени функционирования приложения переходя из одного состояния в другое. ● В соответствии с философией GLib элементы имеют именованные свойства. ● Для соединения элементов в цепочку используются точки подключения, т.н. pads: – sinkpad – вход потока данных в элемент – srcpad – вывод потока данных из элемента У элемента может быть несколько точек подключения.
  • 13. Элементы: источники ● Источники – это класс плагинов, которые позволяют читать медиаданные из различных источников: – Filesystem (filesrc, multifilesrc) – Network (souphttpsrc, rtspsrc, udpsrc) – Devices (alsasrc, v4l2src) – Others (fakesrc, audiotestsrc, videotestsrc)
  • 14. Элементы: приемники ● Приемники – это оконечные элементы pipeline, они “выводят медиаданные” за его пределы. – Filesystem (filesink, multifilesink) – X-server (ximagesink, xvimagesink) – Network (udpsink)
  • 15. Элементы: фильтры ● Фильтры – это элементы, которые выполняют различные преобразования над потоком данных. Это, пожалуй, самый обширный класс элементов, который объединяет мультиплексоры/демультиплексоры потоков, парсеры, кодеры/декодеры и многое другое.
  • 16. Элементы: прочие элементы ● Анализаторы потока – элементы этой категории пропускают через себя поток данных, не модифицируя его, но изменняют свое состояние и/или генерируют событие. ● Вспомогательные элементы – к этой категории относятся очереди, “разветвители” потока данных и некоторые другие элементы.
  • 17. Элемент: конечный-автомат ● Состояния элемента в течение времени жизни: – NULL – элемент неактивен и не владеет никакими ресурсами – READY – элементу предоставлена часть ресурсов, не относящихся напрямую к обработке потока данных (динамические библиотеки, ресурсы аппаратуры) – PAUSED – элемент готов принимать и обрабатывать потоки данных – PLAYING – элемент обрабатывает поток данных
  • 18. Элемент: конечный автомат ● Диаграмма переходов NULL READY PAUSED PLAYING
  • 19. Строительные блоки: контейнеры ● Контейнеры представляют собой особую категорию элементов. ● Контейнеры объединяют несколько элементов, позволяя управлять ими одновременно (например, изменять состояние)
  • 23. Pipeline: пример gst-launch-1.0 filesrc location='movie.mkv' ! matroskademux name=d ! queue ! avdec_h264 ! xvimagesink d. ! queue ! avdec_mp3 ! alsasink
  • 24. Взаимодействие элементов ● Для взаимодействия элементов между собой и с приложением верхнего уровня используются следующие сущности: – Pad – Bus – Buffers – Events – Messages – Query
  • 26. Gstreamer: пишем код void Recorder::init_pipeline() { std::string pipeline(“rtspsrc name=src ! rtph264_depay ! H264parse ! tee name=t” “ t. ! queue ! appsink name=h264sink “ “ t. ! queue ! splitmuxsink max-size-time=90000000000 muxer=qtmux“); _pipeline = gst_parse_launch(pipeline.c_str(), NULL); _rtspsrc = gst_bin_get_by_name(GST_BIN(_pipeline), “src”); _h264sink = gst_bin_get_by_name(GST_BIN(_pipeline), “h264sink”); g_object_set(_h264sink, “emit-signals”, TRUE, NULL); _new_sample_id = g_signal_connect(_h264sink, “new-sample”, G_CALLBACK(new_sample), this); GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(_pipeline)); _bus_watch_id = gst_bus_add_watch(bus, on_bus_message, this); g_object_unref(bus); }
  • 27. Gstreamer: пишем код GstFlowReturn Recorder::new_sample(GstElement *element, gpointer userdata) { Recorder *recorder = static_cast<Recorder*>(userdata); GstSample *sample = NULL; g_signal_emit_by_name(element, “pull-sample”, &sample); if (sample) { if (element == recorder->_appsink) recorder->_detector.push_sample(sample); gst_sample_unref(sample); } return GST_FLOW_OK; }
  • 28. Gstreamer: пишем код gboolean Recorder::on_bus_message(GstBus *bus, GstMessage *msg, gpointer userdata) { Recorder *recorder = static_cast<Recorder*>(userdata); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_ERROR: recorder->on_message_error(msg); break; case GST_MESSAGE_EOS: recorder->on_message_eos(msg); break; case GST_MESSAGE_STATE_CHANGED: recorder->on_message_state_changed(msg); break; default: recorder->on_message_other(msg); } return TRUE; }
  • 29. GStreamer: пишем код void Recorder::start() { GstStateChangeReturn ret = gst_element_set_state(_pipeline, GST_STATE_PLAYING); _detector.start(); } void Recorder::stop() { _detector.stop(); GstStateChangeReturn ret = gst_element_set_state(_pipeline, GST_STATE_NULL); }
  • 30. GStreamer: пишем код void Detector::init_pipeline() { std::string pipeline(“appsrc ! ” #if defined BUILD_PROFILE_IMX “ vpudec ! imxvideoconvert_g2d ! capsfilter caps=”video/x-raw,width=640,height=480” ! videoconvert ! ” #elif defined BUILD_PROFILE_PC “ avdec_h264 ! videoconvert ! videoscale ! capsfilter caps=”video/x- raw,width=640,height=480, format=RGB” ! ” #else #error “Undefined build profile” #endif “ motioncells name=mdcells display=FALSE gridx=32 gridy=32 ! videorate name=vrate “); _pipeline = gst_parse_launch(pipeline.c_str(), NULL);
  • 31. GStreamer: пишем код _mdcells = gst_bin_get_by_name(GST_BIN(_pipeline), “mdcells”); _vrate = gst_bin_get_by_name(GST_BIN(_pipeline), “vrate”); GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(_pipeline)); _bus_watch_id = gst_bus_add_watch(bus, on_bus_message, this); g_object_unref(bus); }
  • 32. Gstreamer: пишем код gboolean Detector::on_bus_message(GstBus *bus, GstMessage *msg, gpointer userdata) { Detector *detector = static_cast<Detector*>(userdata); if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ELEMENT && GST_MESSAGE_SRC(msg) == _mdcells) { const GstStructure *msg_struct = gst_message_get_structure(msg); if (gst_structure_has_name(msg_struct, “motion”) { if (gst_structure_has_field(msg_struct, “motion_begin”) _recorder.start_recording(); else if (gst_structure_has_field(msg_struct, “motion_finished”) _recorder.stop_recording(); } } return TRUE; }
  • 33. GStreamer: итоги Подводя итоги, я хочу отметить некоторые достоинства и недостатки фреймворка: ● Достоинства – Возможность быстрого прототипирования сложных схем обработки аудио/видеоданных – Модульная архитектура – Поддержка широкого спектра устройств ввода-вывода ● Недостатки – Написан на C – Далеко не все элементы качественно реализованы