找回密码
 注册
查看: 3957|回复: 2

Linux下多媒体编程利器--GStreamer

[复制链接]
发表于 2005-10-27 09:51:26 | 显示全部楼层 |阅读模式
这一是篇以前未写完的笔记,由于时间关系,一直没有静下心下续笔。现在也不知道什么时间有空继续。先放在这里吧。

------------------------------------------------------------
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》等
发表于 2005-10-27 10:34:57 | 显示全部楼层
好文章!继续
回复 支持 反对

使用道具 举报

发表于 2005-10-27 13:13:44 | 显示全部楼层
在 IBM dW 有相当不错的 GStreamer 介绍,GStreamer 官方也有不错的 tutorial。

GStreamer 在体系和架构方面确实不错,基于插件体系,流式处理过程,都是很好的设计。
可惜就是两个主要的应用 Totem 和 Rhythmbox 我都不喜欢   在偶个 Gnome 2.8/2.10(FC3/4)桌面上就没好好工作过。Rhythmbox 在 utf-8 环境下没法没法处理我 gbk 编码的 mp3 id3tags(据说是配置问题,我反正没配置成功过),而 Totem 根本是不停 segfault。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2022-5-24 07:21 , Processed in 0.049093 second(s), 15 queries .

© 2021 Powered by Discuz! X3.4.

快速回复 返回顶部 返回列表