我试图使用gstreamer在UDP上发送带有特定元数据的图像。发送方处理从摄像机中获取图像,并将它们以appsrc ! rtpvrawpay ! udpsink的形式发送到管道中(下面是完整的管道字符串,以防它很重要)。在接收者方面,我使用udpsrc ! rtpvrawdepay ! appsink。
为了增加元数据,我在rtpvrawpay的源Pad上放置了一个探针,并在rtpvrawdepay的Sink Pad上读取了探针。到目前为止我遇到的问题是:
GST_PAD_PROBE_TYPE_BUFFER_LIST数据,而“接收器”探针- GST_PAD_PROBE_TYPE_BUFFER。我希望我在UDP的两边都会得到相同的数据类型,那么为什么不是呢?twobytes_header,当试图在探测中的缓冲区gst_rtp_buffer_map时,它已经失败了。UPDATE:成功读取接收端的标头,请参阅下面的代码。仍然想了解为什么我在两个探测位置上看到缓冲区列表和缓冲区。将欣赏任何见解,或可能是一个更好的方向,以发送元数据与图像的UDP。
发送者管道:appsrc ! videoconvert ! queue ! rtpvrawpay name=ToRTP ! queue ! udpsink host=192.168.42.49 port=5566 sync=false async=false
接收者管线:udpsrc port=5566 caps="application/x-rtp, media=(string)video, sampling=(string)BGR, clock-rate=(int)90000, depth=(string)8, width=(string)640, height=(string)480, encoding-name=(string)RAW" ! rtpvrawdepay name=FromRTP ! queue ! videoconvert ! appsink
UPDATE:为我工作的代码:
发件人代码:
GstRTPBuffer rtp_buf = GST_RTP_BUFFER_INIT;
gst_rtp_buffer_map(*buffer, GST_MAP_READWRITE, &rtp_buf);
gst_rtp_buffer_add_extension_twobytes_header(&rtp_buf, 1, 1, myInfo->buf, sizeof(myInfo->buf));
gst_rtp_buffer_unmap(&rtp_buf);收信人代码:
GstRTPBuffer rtp_buf = GST_RTP_BUFFER_INIT;
GstBuffer* buf = GST_PAD_PROBE_INFO_BUFFER(info);
gst_rtp_buffer_map(buf, GST_MAP_READ, &rtp_buf);
gpointer myInfoBuf = nullptr;
guint size = 0;
gst_rtp_buffer_get_extension_twobytes_header(&rtp_buf, &appbits, 1, 0, &myInfoBuf, &size);
gst_rtp_buffer_unmap(&rtp_buf);发布于 2021-11-20 17:31:52
“源”探测器接收GST_PAD_PROBE_TYPE_BUFFER_LIST数据,而“接收器”探针- GST_PAD_PROBE_TYPE_BUFFER。我希望在UDP的两边都能得到相同的数据类型,那么为什么不是呢?
在发送方上,这取决于通过RTP付费加载器的数据类型:适合于付费加载器的MTU配置的小数据包(例如音频或小视频帧)将触发GST_PAD_PROBE_TYPE_BUFFER探针,而超过MTU的数据包将被拆分为分组列表并触发GST_PAD_PROBE_TYPE_BUFFER_LIST探针。
在接收器上,您在RTP解装载器的接收器盘上的探针总是接收来自UDP源的单个数据包,在这种情况下,GST_PAD_PROBE_TYPE_BUFFER是适用的。
https://stackoverflow.com/questions/67603364
复制相似问题