了解GStreamer

GStreamer总览

GStreamer是一个基于glib实现的跨平台多媒体框架。以下是架构图:


GStreamer架构图

GStreamer实现了多媒体处理的框架,主要是一个管道(pipline)包含多个元件(element)组成。管道继承自容器(bin),容器可以方便管理元件,用于串联元件,处理修改元件的状态,生命周期等。管道会提供一个消息总线(bus),用于元件的状态同步。而元件会包含一个或多个垫片(pad),用于数据的源(src)和槽(sink),每个数据源鱼一个数据槽相连接。这样多个元件在管道中就形成了复杂的处理流程了。

基本流程

首先初始化GStreamer库,库前缀为 gst_,glib前缀为 g_

// argc, argv 是初始化GStreamer的命令行参数
gst_init (&argc, &argv);

然后创建管道

pipeline = gst_pipeline_new ("test-pipeline");

创建对应的元件,采用了工厂模式

  source = gst_element_factory_make ("videotestsrc", "source");
  filter = gst_element_factory_make ("timeoverlay", "filter");
  sink = gst_element_factory_make ("autovideosink", "sink");

连接元件

// 先把元件加入到容器(管道)中
gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);
// 再确定连接方式
gst_element_link_many (source, filter, sink, NULL);

整个管道就创建好了,然后我们就让管道开始工作

gst_element_set_state (pipeline, GST_STATE_PLAYING);

最后,一直等待管道完成工作

bus = gst_element_get_bus (pipeline);
msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
      GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

完成我们要的功能后,释放整个管道,防止资源泄露。整个管道可以有容器统一处理,所以不需要每个元件都去释放。同时glib实现的GObject是用引用计数实现的资源回收,而且GstElement继承自GInitiallyUnowned,所以元件默认是没有人引用的。容器可以完美的释放元件。

  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);

常用元件

以上就是一个基本的GStreamer项目。接下来我们看看GStreamer有哪些常用元件。

处理文件的输入,输出

  1. filesrc 读取一个本地文件作为输出流,指定文件路径参数为location。
  2. filesink 写入流到一个本地文件,指定文件路径参数为location。

网络源文件输入

  1. souphttpsrc 用一个网络地址作为输出流。指定文件路径参数为location。

测试媒体数据生成

  1. videotestsrc 生成一个固定的video输出流。用pattern指定参数。
  2. audiotestsrc 生成一个固定的audio输出流。用wave指定参数。

视频适配

  1. ffmpegcolorspace 自动转换色彩空间
  2. videorate 匹配不同的视频帧率
  3. videoscale 自动修改视频尺寸

音频适配

  1. audioconvert 自动音频格式适配
  2. audioresample 自动匹配采样率
  3. audiorate 自动音频帧率

多线程

  1. queue 增加一个线程处理数据。
  2. queue2 增加一个线程处理数据。
  3. tee 把一份数据分为多份。

过滤器

  1. capsfilter 根据caps来过滤数据流。
  2. typefind 这个element决定了一个流所包含的媒体的类型。它按照他们的等级调用typefind函数。一旦检测到,它就会把source pad设置成发现的媒体类型,然后发出have-type信号。

调试

  1. fakesink
  2. identity

基本流程摘抄自这里
常用元件摘抄自这里.

你可能感兴趣的:(了解GStreamer)