推送缓冲区对于 GstWebRTCBin 类型的实例无效
push-buffer is invalid for instance of type GstWebRTCBin
您好,我正在尝试将数据推送到 Gstreamer 的 webrtcbin 中。
这是我的管道,适用于 testdata
pipeline =
gst_parse_launch("webrtcbin "
"name=webrtcbin stun-server=stun://stun.l.google.com:19302 "
"appsrc ! videorate ! "
"video/x-raw,"
"width=1280,"
"height=720,"
"framerate=15/1 "
"! videoconvert ! queue max-size-buffers=1 ! "
"x264enc bitrate=600 speed-preset=ultrafast tune=zerolatency key-int-max=15 ! "
"video/x-h264,profile=constrained-baseline ! queue max-size-time=100000000 ! h264parse ! "
"rtph264pay config-interval=-1 name=payloader ! "
"application/x-rtp,"
"media=video,"
"encoding-name=H264,"
"payload=96 ! webrtcbin. ", &error);
现在我尝试推入一些相机数据
根据我对 https://gstreamer.freedesktop.org/documentation/app/appsrc.html?gi-language=c
的阅读
GstFlowReturn ret;
memcpy(gst_Imageptr, msg->data.data(), msg->data.size());
gst_ImageBuffer = gst_buffer_new_wrapped((void*)gst_Imageptr, msg->data.size());
g_signal_emit_by_name(webrtcbin, "push-buffer", gst_ImageBuffer, &ret);
if (ret != GST_FLOW_OK) {
/* some error, stop sending data */
GST_DEBUG ("some error");
}
但我收到错误
push-buffer' is invalid for instance '0x55bb4cc0f0' of type 'GstWebRTCBin
所以我的问题是,是否有其他方法可以将数据推送到 GstWebRTCBin 中?
页面 https://gstreamer.freedesktop.org/documentation/webrtc/index.html?gi-language=c#signals 仅显示与建立连接相关的信号。
感谢任何建议!!
您使用的 gst_buffer_new_wrapped
基本上不复制内存,而是引用 gst_Imageptr
拥有的内存。因此,您需要保证:?
gst_Imageptr
指向至少 msg->data.size()
大小的已分配内存
gst_Imageptr
指向的内存比 gst_ImageBuffer
对象长
gst_Imageptr
指向的内存没有被新数据替换,而gst_ImageBuffer
仍然引用之前的
我建议尝试 gst_buffer_new_allocate
+ gst_buffer_fill
并检查您的问题是否消失。所以像下面这样:
GstBuffer* gst_ImageBuffer = gst_buffer_new_allocate(nullptr, msg->data.size());
size_t filled_size = gst_buffer_fill(gst_ImageBuffer, 0, msg->data.data(), msg->data.size());
g_signal_emit_by_name(webrtcbin, "push-buffer", gst_ImageBuffer, &ret);
所以我发现了我的问题,而且一直很简单,但由于缺乏 gstreamer 知识,对我来说很难
我试图将信号推向 webrtcbin,而我本应推向 appsrc。这些是不同的单位。
所以我给 appsrc 起了个名字:
"webrtcbin name=webrtcbin stun-server=stun://stun.l.google.com:19302 "
"appsrc name=CaliCam !"
"video/x-raw, format=BGR, width=640, height=480, framerate=10/1 !"
然后入库参考
GstElement *appsrc = gst_bin_get_by_name( GST_BIN( pipeline), "CaliCam");
这样我就可以推送信号
g_signal_emit_by_name(appsrc, "push-buffer", gst_ImageBuffer, &ret);
内存副本适用于两个版本。与 tomaszmi 的建议相比,我不确定是否预先分配内存(我这样做的方式)并确保其存在的 CPU 和内存效率是否较低。但这不是 post
的重点
您好,我正在尝试将数据推送到 Gstreamer 的 webrtcbin 中。 这是我的管道,适用于 testdata
pipeline =
gst_parse_launch("webrtcbin "
"name=webrtcbin stun-server=stun://stun.l.google.com:19302 "
"appsrc ! videorate ! "
"video/x-raw,"
"width=1280,"
"height=720,"
"framerate=15/1 "
"! videoconvert ! queue max-size-buffers=1 ! "
"x264enc bitrate=600 speed-preset=ultrafast tune=zerolatency key-int-max=15 ! "
"video/x-h264,profile=constrained-baseline ! queue max-size-time=100000000 ! h264parse ! "
"rtph264pay config-interval=-1 name=payloader ! "
"application/x-rtp,"
"media=video,"
"encoding-name=H264,"
"payload=96 ! webrtcbin. ", &error);
现在我尝试推入一些相机数据 根据我对 https://gstreamer.freedesktop.org/documentation/app/appsrc.html?gi-language=c
的阅读 GstFlowReturn ret;
memcpy(gst_Imageptr, msg->data.data(), msg->data.size());
gst_ImageBuffer = gst_buffer_new_wrapped((void*)gst_Imageptr, msg->data.size());
g_signal_emit_by_name(webrtcbin, "push-buffer", gst_ImageBuffer, &ret);
if (ret != GST_FLOW_OK) {
/* some error, stop sending data */
GST_DEBUG ("some error");
}
但我收到错误
push-buffer' is invalid for instance '0x55bb4cc0f0' of type 'GstWebRTCBin
所以我的问题是,是否有其他方法可以将数据推送到 GstWebRTCBin 中? 页面 https://gstreamer.freedesktop.org/documentation/webrtc/index.html?gi-language=c#signals 仅显示与建立连接相关的信号。
感谢任何建议!!
您使用的 gst_buffer_new_wrapped
基本上不复制内存,而是引用 gst_Imageptr
拥有的内存。因此,您需要保证:?
gst_Imageptr
指向至少msg->data.size()
大小的已分配内存gst_Imageptr
指向的内存比gst_ImageBuffer
对象长gst_Imageptr
指向的内存没有被新数据替换,而gst_ImageBuffer
仍然引用之前的
我建议尝试 gst_buffer_new_allocate
+ gst_buffer_fill
并检查您的问题是否消失。所以像下面这样:
GstBuffer* gst_ImageBuffer = gst_buffer_new_allocate(nullptr, msg->data.size());
size_t filled_size = gst_buffer_fill(gst_ImageBuffer, 0, msg->data.data(), msg->data.size());
g_signal_emit_by_name(webrtcbin, "push-buffer", gst_ImageBuffer, &ret);
所以我发现了我的问题,而且一直很简单,但由于缺乏 gstreamer 知识,对我来说很难
我试图将信号推向 webrtcbin,而我本应推向 appsrc。这些是不同的单位。
所以我给 appsrc 起了个名字:
"webrtcbin name=webrtcbin stun-server=stun://stun.l.google.com:19302 "
"appsrc name=CaliCam !"
"video/x-raw, format=BGR, width=640, height=480, framerate=10/1 !"
然后入库参考
GstElement *appsrc = gst_bin_get_by_name( GST_BIN( pipeline), "CaliCam");
这样我就可以推送信号
g_signal_emit_by_name(appsrc, "push-buffer", gst_ImageBuffer, &ret);
内存副本适用于两个版本。与 tomaszmi 的建议相比,我不确定是否预先分配内存(我这样做的方式)并确保其存在的 CPU 和内存效率是否较低。但这不是 post
的重点