GStreamer 组件笔记

目录

下载地址:

测试命令:

GStreamer总览

基本流程

常用元件


下载地址:

首先你需要从Index of /data/pkg/windows下载库

您需要为开发人员和非开发人员下载并安装安装程序。

例如对于 1.20,它是现在的最新版本,

gstreamer-1.0-devel-msvc-x86_64-1.20.0.msi    2022-02-04 05:36    186M    

特点:devel版包含lib和dll文件,vs开发调用需要这个

gstreamer-1.0-msvc-x86_64-1.20.0.msi    2022-02-04 05:52    104M    

特点:只有dll文件, 不能用vs来开发项目。

测试命令:

gst-play-1.0.exe D:\\data\\person\\skivideo.mp4

GStreamer总览

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

GStreamer 组件笔记_第1张图片

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



作者:通往心的路
链接:https://www.jianshu.com/p/550ea698c053
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(视频编解码,开发语言,c++)