|
这一是篇以前未写完的笔记,由于时间关系,一直没有静下心下续笔。现在也不知道什么时间有空继续。先放在这里吧。
------------------------------------------------------------
Linux下多媒体编程利器--GStreamer
Linux要写个媒体播放器,对于初学者来说想来是件困难的事。但如果你了解了GStreamer,你会改变这种想法。本文是作者近期略窥GStreamer后的一些笔记,稍加整理,希望对与我相同的初学者有些许借鉴。也因此,如果发现文中存在这样那样的错误,你不应该觉得奇怪。
1. GStreamer简介
1.1 GStreamer是啥东东
简而言之,GStreamer是流媒体软件的开发框架。可以这样说,在该框架的支持下,你可以非常简单地为很多格式的流媒体写出自已需要的程序。
现在,GStreamer已经内置对MP3、Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、mod等媒体格式的支持,如果你需要开发此类软件,你可以直接为我所用。如果你程序需要用到GStreamer未包含的格式,你可以通过开发相应的插件来达到你的目的。
GStreamer及其自带的插件支持GNU LGPL协议。具体信息请参阅源代码所附的相关说明文档。
1.2 如何搭建GStreamer环境
笔者写文本时,目前稳定版是0.8.11。你可以在 http://gstreamer.freedesktop.org/download/ 下载相关的rpm、deb或源代码进行安装。建议除安装GStreamer外,另外安装其插件plugins,以支持更多的功能和媒体格式。
0.9.x版改进了一些接口支持,0.8.x版的个别函数在0.9.x中已经不再支持,而升级为更加方便快捷的方式进行组织调用,如线程管道等,但总体变化不算大,你可以比较快地将0.8.x的源代码转换成0.9.x中继续使用。目前0.9.x未正式释放,但其源代码已经可以在官方下载获取。
本文主要以0.8.x版为准写的。
2. GStreamer基础
如果你把GStreamer理解为是一种媒体播放器的话,那就大错特错了。上面说了,它只是流媒体程序的开发框架而已,它本身是C语言开发的,提供了大量已知媒体的编程接口,供程序员调用,同时也允许程序员自行开发插件来定制自己所需的功能和格式。
2.1 元件
要了解GStreamer,你首先要理解的是元件(Elements)这个概念。你可以把它想象成一个黑匣子,开发者可以有目的地通过使用和设置相应的元件来为你处理数据。比如使用解码器(codecs)元件(过滤器(Filters)元件的一种),你可以从另一元件中取得已经编码的数据,通过该解码器元件进行正确解码后,输出解码数据至另一元件中使用。GStreamer正是通过组合使用各种元件来实现流媒体处理的。
2.1.1 主要分类
元件主要可以分成三大类,我们先简单了解一下:
* 源元件(Source elements)
这种元件主要负责生成数据。如从磁盘文件或声卡中读取数据,来提供后续元件使用。
* 过滤元件(Filters elements)
从名称上可以看出,这种元件是负责数据处理转换的。如进行音频数据的编码或解码、音视频数据的分离、混音处理等。
* 接收元件(Sink elements)
这种元件是媒体处理的终点,它只被动接收数据,不会对数据进行任何处理。如音频回放、视频输出、保存音视频数据到磁盘等。
2.1.2 创建元件
要使用元件,就必须首先创建它。它的创建是通过“元件工厂(element factory)”来实现的。最简单的办法是调用函数gst_element_factory_make()。
如:
element = gst_element_factory_make ("fakesrc", "source");
这样我们就已经创建一个名为element的元件了。函数中的字符串参数source代表该元件属于源元件。替换其参数串,可以创建其他各种功能的元件。
[code:1]例一:
#include <gst/gst.h> /*所有的gstreamer编程,都需要包含该头文件*/
int
main (int argc,
char *argv[])
{
GstElement *source, *filter, *sink;
gst_init (&argc, &argv);/*初始化gst设备,其中的参数与main()函数非常相似,可以支持在命令行下直接输入媒体文件等*/
/* 以下创建了分别源、过滤器和接收等三个元件 */
source = gst_element_factory_make ("fakesrc", "source");
filter = gst_element_factory_make ("identity", "filter");
sink = gst_element_factory_make ("fakesink", "sink");
/* 将三个元件链接在一起 */
gst_element_link_many (source, filter, sink, NULL);
[..]
}[/code:1]
2.2 管道(pipeline)
显然,我们必须按照一定规则将所需要的元件“码放”在一起,才能使各种元件发挥它们各自的作用,这样,GStreamer引入了“管道(pipline)”这个概念。
我们可以把管道理解为用于放置元件的更大的“黑匣子”。只要把我们所需要的元件放入这个“大黑匣子”后,就可以通过控制这个“大黑匣子”来实现控制流媒体处理的目的了。
由于管道也是从元件继承而来的,所以创建管道与创建元件的方法非常相似。
(待续)
------------------------------------------------------------
主要参考资料:
1.肖文鹏的《用 GStreamer 简化 Linux 多媒体开发》
2.http://gstreamer.freedesktop.org/documentation/中的《Application Development Manual》等 |
|