Gstreamer: мультиплексировать видеопоток + оверлей в один сетевой поток? - PullRequest
0 голосов
/ 21 февраля 2019

Я использую GStreamer в сценарии, в котором я хочу передавать видеопоток по сети, при этом части видео динамически помечаются как прозрачные для дальнейшей обработки / наложения на стороне приемника.

Первоначально,Я пытался использовать данные RGBA (потому что это то, для чего они нужны), но, похоже, нет распространенных форматов сжатия видео или даже изображений, которые допускают альфа-канал.Самое близкое, что я нашел, это JPEG2000, но, черт возьми, транскодеры работают медленно.

Мое настоящее хакерское, но работающее решение - просто закрасить предположительно прозрачные части видео ярко-зеленым цветом (0x00FF00)и используйте альфа-элемент на стороне получателя для объединения с наложением.Проблема решена.

Однако другой новый вариант использования будет включать в себя наличие как полного исходного видео, так и и маски прозрачности на стороне приемника.Конечно, подход «зеленого экрана» в данном случае терпит неудачу, потому что исходное видео было закрашено маской.

Я кратко экспериментировал с использованием мультиплексированного транспортного потока MPEG, но результаты не были ошеломляющими.(массивные выпадения кадров и артефакты сжатия, даже на локальном хосте).

Для справки, я протестировал исходный конвейер:

gst-launch-1.0 -e mpegtsmux alignment=7 name="muxer" ! rtpgstpay config-interval=1 ! udpsink host=127.0.0.1 port=5000 \
  v4l2src ! video/x-raw,format=YUY2,framerate=15/1,width=640,height=480 ! videoconvert ! x264enc ! muxer. \
  videotestsrc ! video/x-raw,framerate=15/1,width=640,height=480 ! x264enc ! muxer.

А вот конвейер стока:

gst-launch-1.0 -m -e udpsrc port=5000 ! application/x-rtp ! rtpgstdepay ! \ 
  tsparse ! tsdemux name=demux   demux.video_0_0041 ! h264parse ! avdec_h264 ! \ 
  videoconvert ! fpsdisplaysink

Я могу выбрать второй поток, используя demux.video_0_0042, но я получаю что-то вроде 2-3 FPS (у источников 15), и качество ужасающее (почти не распознается видео).

Конечно, я мог бы просто настроить второй, независимый сетевой поток, но это привело бы к большим накладным расходам (второй сетевой приемник и источник, второй кодер / декодер, плюс проблемы синхронизации и т. Д. И т. Д.).Любые предложения по альтернативным подходам будут очень приветствоваться!

...