GStreamer总览
GStreamer是一个基于glib实现的跨平台多媒体框架。以下是架构图:
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有哪些常用元件。
处理文件的输入,输出
- filesrc 读取一个本地文件作为输出流,指定文件路径参数为location。
- filesink 写入流到一个本地文件,指定文件路径参数为location。
网络源文件输入
- souphttpsrc 用一个网络地址作为输出流。指定文件路径参数为location。
测试媒体数据生成
- videotestsrc 生成一个固定的video输出流。用pattern指定参数。
- audiotestsrc 生成一个固定的audio输出流。用wave指定参数。
视频适配
- ffmpegcolorspace 自动转换色彩空间
- videorate 匹配不同的视频帧率
- videoscale 自动修改视频尺寸
音频适配
- audioconvert 自动音频格式适配
- audioresample 自动匹配采样率
- audiorate 自动音频帧率
多线程
- queue 增加一个线程处理数据。
- queue2 增加一个线程处理数据。
- tee 把一份数据分为多份。
过滤器
- capsfilter 根据caps来过滤数据流。
- typefind 这个element决定了一个流所包含的媒体的类型。它按照他们的等级调用typefind函数。一旦检测到,它就会把source pad设置成发现的媒体类型,然后发出have-type信号。
调试
- fakesink
- identity