Gstreamer:将视频流+叠加层复用到一个网络流中?

时间:2019-02-21 19:07:58

标签: video-streaming gstreamer video-encoding

我在要通过网络传输视频流的情况下使用GStreamer,其中部分视频动态地标记为透明,以便在接收方进行进一步处理/叠加。

最初,我曾尝试使用RGBA数据(因为这就是它的用途),但是似乎没有允许alpha通道使用的通用视频甚至图像压缩格式。我找到的最接近的是JPEG2000,但是,天哪,转码器的速度很慢。

我目前的可行但可行的解决方案是仅用鲜艳的绿色(0x00FF00)在视频的透明部分上绘画,并使用接收方的alpha元素与覆盖层合并。问题解决了。

但是,另一个新的用例是在接收方同时拥有完整的原始视频,。当然,“绿屏”方法在这里失败了,因为原始视频已用蒙版覆盖。

我已经简短地尝试了使用多路复用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帧/秒(来源有15帧),而且质量太差了(几乎没有可识别的视频到达)。

当然,我可以设置第二个独立的网络流,但这会带来很多开销(第二个网络接收器和源,第二个编码器/解码器以及同步问题等)。任何关于替代方法的建议都将受到欢迎!

0 个答案:

没有答案