如何通过gstreamer获取视频流的宽度/高度?

如何通过gstreamer获取视频流的宽度/高度?,gstreamer,Gstreamer,如何通过gstreamer获取视频流的宽度/高度?我有一个C++的流水线,结构如下: rtspsrc -> rtpjitterbuffer -> rtph264depay -> mpegtsmux -> filesink 我的任务是:当我获得第一个图像数据(h264编码或mjpeg)时,我需要从中查询宽度和高度。可能吗? 我试图从rtph264depay的“src”pad中获取当前的caps,并从其结构中获取宽度/高度,但最后一个操作失败 谢谢 您可以使用typefin

如何通过gstreamer获取视频流的宽度/高度?我有一个C++的流水线,结构如下:

rtspsrc -> rtpjitterbuffer -> rtph264depay -> mpegtsmux -> filesink
我的任务是:当我获得第一个图像数据(h264编码或mjpeg)时,我需要从中查询宽度和高度。可能吗? 我试图从rtph264depay的“src”pad中获取当前的caps,并从其结构中获取宽度/高度,但最后一个操作失败


谢谢

您可以使用typefind元素,该元素用于查找流的媒体类型并从中获取CAP


希望有帮助

您使用的是0.10吗?它是旧的、过时的,多年来都没有人戴。请移到1.0

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


在1.0中,它的工作原理应该是相同的,但是在pad上使用一个事件探测器并查找CAPS事件。

对于RTP H264流,我有相同的任务。C++中的编码 我将为未来的开发人员提供一个简短的代码片段

我的烟斗看起来像这样

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


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

此解决方案需要解码流并提高CPU使用率。我认为您的内存泄漏。该行不应该是
GstCaps*caps=NULL
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);