首页 > 解决方案 > 从 C++ 向 gstreamer 提供视频;如何获得工作时间

问题描述

我正在尝试将 gstreamer 管道添加到我的程序中。我的程序生成了一个我希望由 gstreamer 处理的视频流。这基本上只在时间上有效:显示的每一帧之间存在巨大的延迟。同样在几秒钟后,它完全停止。

这是启动流的代码:

    GstCaps *video_caps = gst_caps_new_simple("video/x-raw",
             "format", G_TYPE_STRING, "RGB",
             "width", G_TYPE_INT, w,
             "height", G_TYPE_INT, h,
             "block", G_TYPE_BOOLEAN, TRUE,
             "do-timestamp", G_TYPE_BOOLEAN, TRUE,
             "framerate", GST_TYPE_FRACTION, fps, 1, nullptr);

    gst_app_src_set_caps(GST_APP_SRC(appsrc), video_caps);

    gst_app_src_set_max_bytes((GstAppSrc *)appsrc, 1 * w * h * 3);

    gst_element_set_state(gpipeline, GST_STATE_PLAYING);

然后对于我做的每一帧:

    GstBuffer *buffer = gst_buffer_new_and_alloc(w * h * 3); 
    gst_buffer_fill(buffer, 0, my_frame, w * h * 3); 

    if (gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer) != GST_FLOW_OK)
            log(LL_WARNING, "Problem queing frame");

完整源码:完整源码

标签: gstreamer

解决方案


我认为您还需要直接设置一些 appsrc 属性,而不仅仅是大写。例如block,anddo-timestamp不是上限,不会在那里产生任何影响。请参阅https://github.com/floe/surface-streams/blob/master/common.cpp#L189-L207以供参考:

  /* setup */
  g_object_set (G_OBJECT (appsrc), "caps",
    gst_caps_new_simple ("video/x-raw",
      "format", G_TYPE_STRING, type,
      "width",  G_TYPE_INT, tw,
      "height", G_TYPE_INT, th,
      "framerate", GST_TYPE_FRACTION, 0, 1,
    NULL), NULL);
  gst_bin_add_many (GST_BIN (gpipeline), appsrc, videosink, NULL);
  gst_element_link_many (appsrc, videosink, NULL);

  /* setup appsrc */
  g_object_set (G_OBJECT (appsrc),
    "stream-type", 0, // GST_APP_STREAM_TYPE_STREAM
    "format", GST_FORMAT_TIME,
    "is-live", TRUE,
    "block", TRUE,
    "do-timestamp", TRUE,
    NULL);

推荐阅读