【问题标题】:How to get width/height of a video stream via gstreamer?如何通过 gstreamer 获取视频流的宽度/高度?
【发布时间】:2014-09-24 09:44:22
【问题描述】:

如何通过 gstreamer 获取视频流的宽度/高度?我有一个用 C++ 编码的管道,结构如下:

rtspsrc -> rtpjitterbuffer -> rtph264depay -> mpegtsmux -> filesink

我的任务是:当我获得第一个图像数据(h264 编码或 mjpeg)时,我需要从中查询宽度和高度。是否可以? 我试图从 rtph264depay 的 'src' 焊盘获取当前上限并从其结构中获取宽度/高度,但未能做到最后。

谢谢!

【问题讨论】:

    标签: gstreamer


    【解决方案1】:

    我对 RTP H264 流有相同的任务。用 C++ 编码。

    我会给未来的开发者一个简短的代码sn-p。

    我的烟斗是这样的。

    auto source = gst_element_factory_make("udpsrc", nullptr);
    auto rtpJitterBuffer = gst_element_factory_make("rtpjitterbuffer", nullptr);
    auto depay = gst_element_factory_make("rtph264depay", nullptr);
    auto h264parse = gst_element_factory_make("h264parse", nullptr);
    auto decode = gst_element_factory_make("openh264dec", nullptr);
    auto sinkV = gst_element_factory_make("glimagesink", nullptr);
    

    我为解码器使用了探针板。 所以你需要一个

    GstPadProbeCallback
    

    喜欢

    static GstPadProbeReturn pad_cb(GstPad *pad, GstPadProbeInfo *info, gpointer user_data) {
    
        GstEvent *event = GST_PAD_PROBE_INFO_EVENT(info);
        if (GST_EVENT_CAPS == GST_EVENT_TYPE(event)) {
          GstCaps * caps = gst_caps_new_any();
          int width, height;
          gst_event_parse_caps(event, &caps);
    
          GstStructure *s = gst_caps_get_structure(caps, 0);
    
          gboolean res;
          res = gst_structure_get_int (s, "width", &width);
          res |= gst_structure_get_int (s, "height", &height);
          if (!res) {
              qWarning() << "no dimenions";
          }
          qDebug() << "GST_EVENT_CAPS" << width << height;
       }
       return GST_PAD_PROBE_OK;
    }
    

    您可以像这样将探针添加到您的焊盘上

    auto *pad = gst_element_get_static_pad(decode, "src");
    
    gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_EVENT_BOTH, pad_cb, &customData_, nullptr);
    gst_object_unref(pad);
    

    每次格式更改时都会调用此回调。你不需要检查两个方向,但我还是这样做了。

    【讨论】:

    • 此方案需要解码流,增加CPU使用率。
    • 我认为你有内存泄漏。那行不应该是GstCaps * caps = NULL;吗?
    【解决方案2】:

    您可以使用 typefind 元素来查找流的媒体类型并从中获取上限。

    希望有帮助!

    【讨论】:

      【解决方案3】:

      您使用的是 0.10 吗?它陈旧、陈旧、无人维护多年。请移至 1.0。

      也就是说,在 0.10 中,您可以在元素的 pad 中为 notify:caps 信号注册回调。因此,您可以在 h264depay 中执行此操作并检查它是否具有宽度/高度字段。如果没有,您可以添加一个 h264parse,它可能会为您找出宽度和高度,您可以在其源垫中使用 notify:caps。

      在 1.0 中它应该工作相同,但在焊盘上使用事件探测器并查找 CAPS 事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2012-03-19
        • 1970-01-01
        相关资源
        最近更新 更多