【gstreamer常用开发知识】

0. gstreamer工具介绍

这张图描述了Gstreamer的整体框架,GStreamer是一个基于glib实现的跨平台多媒体框架。

0.1 gst-launch-1.0

该工具用来build和run一个Gstreamer pipeline。基本的语法格式如下:

gst-launch-1.0 [OPTIONS] PIPELINE-DESCRIPTION

PIPELINE-DESCRIPTION 是由感叹号(!)分隔开的element list。element的属性可以通过property=value的形式附加到element上。

需要注意的是,gst-launch-1.0主要是一个调试工具,而不能用来构建应用程序。

0.2 gst-inspect-1.0

 该工具用来打印一个Gstreamer plugin 或者 element的information。语法格式如下:

gst-inspect-1.0 [OPTION...] [PLUGIN|ELEMENT]

 Example:

gst-inspect-1.0 filesrc

下面为展示的一些重要信息: 

1. gst-launch与API编程

1.1 capsfilter 插件

该element不会对buffer进行修改,仅仅是用来限制media data的数据格式

example: 限制videotestsrc的数据格式为gray。

 gst-launch-1.0 videotestsrc ! capsfilter caps=video/x-raw,format=GRAY8 ! videoconvert ! autovideosink

 但实际上,我们大多数情况下,看到的pipeline命令如下,简写了capsfilter:

 gst-launch-1.0 videotestsrc ! video/x-raw,format=GRAY8 ! videoconvert ! autovideosink

因此,在application的开发过程中,通常需要新建capsfilter element并设置相应的属性。

 1.2 dynamic pipeline中elements链接

在介绍这个小结之前,需要介绍element之pad的一些特性。

衬垫(Pads)是elements对外的接口。数据流从一个element的源衬垫(source pad)到另一个element的接收衬垫(sink pad)。

一个pad的类型由 2 个特性决定:它的数据导向(direction)以及它的时效性(availability)。

Direction:Gstreamer 定义了 2 种pad的数据导向: src pad以及sink pad。

通过从element内部数据的流动方向得到direction的定义。element在sink pad上接收数据,在src pad上产生数据。具体可由下图来表示。左侧为sink pad,右侧为src pad。数据从左向右流动。

相较于direction而言,pad的availability比较复杂。一个pad可以三种不同类型availabilities。

  • Always: 指的是pad永久存在
  • sometimes:指的是只有某些特定condition下才会存在
  • on request:指的是只有在application请求的情况下才会出现

上述三种类型的availabilities,Always是常见状态,需要重点关注sometimes和on request状态下element与element之间如何连接

 1.2.1 on request 

以deepstream中的nvstreammux element为例,讲解sometimes 状态。下图为nvstreammux的pad template 描述:

 下面是deepstream中deepstream-test1的pipeline命令行实现,其中主要需要注意的是解码器与streammux之间的连接。从上图可以知道,nvstreammux的sink pad的availability类型为on request,即application请求的情况下才生成。

gst-launch-1.0 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
! m.sink_0 nvstreammux name=m batch-size=1 width=1920 height=1080 ! nvinfer config-file-path= configs/deepstream-app/config_infer_primary.txt \
batch-size=1 unique-id=1 ! \
! nvmultistreamtiler rows=1 columns=1 width=1280 height=720 ! nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink

而在application开发过程中,我们需要使用如下的命令完成decode与streammux之间的连接。

gst_element_get_request_pad()方法可以被用来从一个element中请求出一个pad,基于给定的pad name.

  GstPad *sinkpad, *srcpad;
  gchar pad_name_sink[16] = "sink_0";
  gchar pad_name_src[16] = "src";

  sinkpad = gst_element_get_request_pad (streammux, pad_name_sink);
  if (!sinkpad) {
    g_printerr ("Streammux request sink pad failed. Exiting.\n");
    return -1;
  }

  srcpad = gst_element_get_static_pad (decoder, pad_name_src);
  if (!srcpad) {
    g_printerr ("Decoder request src pad failed. Exiting.\n");
    return -1;
  }

  if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) {
      g_printerr ("Failed to link decoder to stream muxer. Exiting.\n");
      return -1;
  }

  gst_object_unref (sinkpad);
  gst_object_unref (srcpad);

 1.2.2 sometimes

以Gstreamer的qtdemux插件为例,介绍在sometimes状态下,如何完成两个elements之间的连接。下图为qtdemux的pad templates介绍:

 在Gstreamer的应用开发手册中的Building An Application中介绍了如何连接oggdemux和decoder elements,介绍的pipeline可用下图表示。

 从上述例子给出的源码中摘取出,用于连接两个elements的内容,具体代码如下。

  /* note that the demuxer will be linked to the decoder dynamically.
     The reason is that Ogg may contain various streams (for example
     audio and video). The source pad(s) will be created at run time,
     by the demuxer when it detects the amount and nature of streams.
     Therefore we connect a callback function which will be executed
     when the "pad-added" is emitted.*/

g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), decoder);

static void
on_pad_added (GstElement *element,
              GstPad     *pad,
              gpointer    data)
{
  GstPad *sinkpad;
  GstElement *decoder = (GstElement *) data;

  /* We can now link this pad with the vorbis-decoder sink pad */
  g_print ("Dynamic pad created, linking demuxer/decoder\n");

  sinkpad = gst_element_get_static_pad (decoder, "sink");

  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);
}

 相同情况下,通过仿照上述的代码,就能完成pad的availability为sometimes之间两个elements的连接。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值