Я использую 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), и качество ужасающее (почти не распознается видео).
Конечно, я мог бы просто настроить второй, независимый сетевой поток, но это привело бы к большим накладным расходам (второй сетевой приемник и источник, второй кодер / декодер, плюс проблемы синхронизации и т. Д. И т. Д.).Любые предложения по альтернативным подходам будут очень приветствоваться!