我在要通过网络传输视频流的情况下使用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帧),而且质量太差了(几乎没有可识别的视频到达)。
当然,我可以设置第二个独立的网络流,但这会带来很多开销(第二个网络接收器和源,第二个编码器/解码器以及同步问题等)。任何关于替代方法的建议都将受到欢迎!