推送缓冲区对于 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 拥有的内存。因此,您需要保证:?

  1. gst_Imageptr 指向至少 msg->data.size() 大小的已分配内存
  2. gst_Imageptr 指向的内存比 gst_ImageBuffer 对象长
  3. 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

的重点