注册本站  论坛  繁體中文

电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Linux >> Linux编程 >> SHELL编程 >> Linux正文

用 GStreamer 简化 Linux 多媒体开发

文章来源:ChinaITLab 收集整理 作者:佚名 更新时间:2004-8-7 【 】 【加入收藏

  GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的编程框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多种格式的多媒体数据。
  
  一、基本概念
  GStreamer 作为 GNOME 桌面环境推荐的流媒体应用框架,采用了基于插件(plugin)和管道(pipeline)的体系结构,框架中的所有的功能模块都被实现成可以插拔的组件(component), 并且在需要的时候能够很方便地安装到任意一个管道上,由于所有插件都通过管道机制进行统一的数据交换,因此很容易利用已有的各种插件“组装”出一个功能完善的多媒体应用程序。
  
  1.1 元件处理
  对于需要应用 GStreamer 框架的程序员来讲,GstElement 是一个必须理解的概念,因为它是组成管道的基本构件,也是框架中所有可用组件的基础,这也难怪 GStreamer 框架中的大部分函数都会涉及到对 GstElement 对象的操作。从 GStreamer 自身的观点来看,GstElement 可以描述为一个具有特定属性的黑盒子,它通过连接点(link point)与外界进行交互,向框架中的其余部分表征自己的特性或者功能。
  
  按照各自功能上的差异,GStreamer 又将 GstElement 细分成如下几类:
  - Source Element 数据源元件 只有输出端,它仅能用来产生供管道消费的数据,而不能对数据做任何处理。一个典型的数据源元件的例子是音频捕获单元,它负责从声卡读取原始的音频数据,然后作为数据源提供给其它模块使用。
  - Filter Element 过滤器元件 既有输入端又有输出端,它从输入端获得相应的数据,并在经过特殊处理之后传递给输出端。一个典型的过滤器元件的例子是音频编码单元,它首先从外界获得音频数据,然后根据特定的压缩算法对其进行编码,最后再将编码后的结果提供给其它模块使用。
  - Sink Element 接收器元件 只有输入端,它仅具有消费数据的能力,是整条媒体管道的终端。一个典型的接收器元件的例子是音频回放单元,它负责将接收到的数据写到声卡上,通常这也是音频处理过程中的最后一个环节。
  
  图1将有助于你更好地理解数据源元件、过滤器元件和接收器元件三者的区别,同时也不难看出它们是如何相互配合形成管道的:
  
  
图1

  
 

  需要注意的是,过滤器元件的具体形式是非常灵活的,GStreamer 并没有严格规定输入端和输出端的数目,事实上它们都可以是一个或者多个。图2 是一个 AVI 分离器的基本结构,它能够将输入数据分离成单独的音频信息和视频信息,用于实现该功能的过滤器元件很明显只具有一个输入端,但却需要有两个输出端。
  
  
图2

  
 

  要想在应用程序中创建 GstElement 对象,唯一的办法是借助于工厂对象 GstElementFactory。由于 GStreamer 框架提供了多种类型的 GstElement 对象,因此对应地提供了多种类型的 GstElementFactory 对象,它们是通过特定的工厂名称来进行区分的。例如,下面的代码通过 gst_element_factory_find() 函数获得了一个名为 mad 的工厂对象,它之后可以用来创建与之对应的 MP3 解码器元件:
  
  GstElementFactory *factory; factory = gst_element_factory_find ("mad");
  
  成功获得工厂对象之后,接下来就可以通过 gst_element_factory_create() 函数来创建特定的 GstElement 对象了,该函数在调用时有两个参数,分别是需要用到的工厂对象,以及即将创建的元件名称。元件名称可以用查询的办法获得,也可以通过传入空指针(NULL)来生成工厂对象的默认元件。下面的代码示范了如何利用已经获得的工厂对象,来创建名为 decoder 的 MP3 解码器元件:
  
  GstElement *element; element = gst_element_factory_create (factory, "decoder");
  
  当创建的 GstElement 不再使用的时候,还必须调用 gst_element_unref() 函数释放其占用的内存资源:
  
  gst_element_unref (element);
  
  GStreamer 使用了与 GObject 相同的机制来对属性(property)进行管理,包括查询(query)、设置(set)和读取(get)等。所有的 GstElement 对象都需要从其父对象 GstObject 那里继承名称(name)这一最基本的属性,这是因为像 gst_element_factory_make() 和 gst_element_factory_create() 这样的函数在创建工厂对象和元件对象时都会用到名称属性,通过调用 gst_object_set_name() 和 gst_object_get_name() 函数可以设置和读取 GstElement 对象的名称属性。
  
  1.2 衬垫处理
  衬垫(pad)是 GStreamer 框架引入的另外一个基本概念,它指的是元件(element)与外界的连接通道,对于框架中的某个特定元件来说,其能够处理的媒体类型正是通过衬垫暴露给其它元件的。成功创建 GstElement 对象之后,可以通过 gst_element_get_pad() 获得该元件的指定衬垫。例如,下面的代码将返回 element 元件中名为 src 的衬垫:
  
  GstPad *srcpad; srcpad = gst_element_get_pad (element, "src");
  
  如果需要的话也可以通过 gst_element_get_pad_list() 函数,来查询指定元件中的所有衬垫。例如,下面的代码将输出 element 元件中所有衬垫的名称:
  
  GList *pads; pads = gst_element_get_pad_list (element); while (pads) {  GstPad *pad = GST_PAD (pads->data);  g_print ("pad name is: %sn", gst_pad_get_name (pad));  pads = g_list_next (pads); }
  
  与元件一样,衬垫的名称也能够动态设置或者读取,这是通过调用 gst_pad_get_name () 和 gst_pad_set_name() 函数来完成的。所有元件的衬垫都可以细分成输入衬垫和输出衬垫两种,其中输入衬垫只能接收数据但不能产生数据,而输出衬垫则正好相反,只能产生数据但不能接收数据,利用函数 gst_pad_get_direction() 可以获得指定衬垫的类型。GStreamer 框架中的所有衬垫都必然依附于某个元件之上,调用 gst_pad_get_parent() 可以获得指定衬垫所属的元件,该函数的返回值是一个指向 GstElement 的指针。 衬垫从某种程度上可以看成是元件的代言人,因为它要负责向外界描述该元件所具有的能力。GStreamer 框架提供了统一的机制来让衬垫描述元件所具有的能力(capability),这是借助数据结构 _GstCaps 来实现的:
  
  struct _GstCaps {  gchar *name; /* the name of this caps */  guint16 id; /* type id (major type) */  guint refcount; /* caps are refcounted */  GstProps *properties; /* properties for this capability */  GstCaps *next; /* caps can be chained together */ };
  
  以下是对 mad 元件的能力描述,不难看出该元件中实际包含 sink 和 src 两个衬垫,并且每个衬垫都带有特定的功能信息。名为sink的衬垫是 mad 元件的输入端,它能够接受 MIME 类型为 audio/mp3 的媒体数据,此外还具有 layer、bitrate 和 framed 三种属性。名为 src 的衬垫是 mad 元件的输出端,它负责产生 MIME 类型为 audio/raw 媒体数据,此外还具有 format、depth、rate 和 channels 等多种属性。
  
  Pads:  SINK template: ’sink’   Availability: Always   Capabilities:   ’mad_sink’:    MIME type: ’audio/mp3’:  SRC template: ’src’   Availability: Always   Capabilities:    ’mad_src’:     MIME type: ’audio/raw’:     format: String: int     endianness: Integer: 1234     width: Integer: 16     depth: Integer: 16     channels: Integer range: 1 - 2     law: Integer: 0     signed: Boolean: TRUE     rate: Integer range: 11025 - 48000
  
  准确地说,GStreamer 框架中的每个衬垫都可能对应于多个能力描述,它们能够通过函数 gst_pad_get_caps() 来获得。例如,下面的代码将输出pad衬垫中所有能力描述的名称及其 MIME 类型:
  
  GstCaps *caps; caps = gst_pad_get_caps (pad); g_print ("pad name is: %sn", gst_pad_get_name (pad)); while (caps) {  g_print (" Capability name is %s, MIME type is %sn",  gst_caps_get_name (cap),  gst_caps_get_mime (cap));  caps = caps->next; }
  
  1.3 箱柜
  箱柜(bin)是 GStreamer 框架中的容器元件,它通常被用来容纳其它的元件对象,但由于其自身也是一个 GstElement 对象,因此实际上也能够被用来容纳其它的箱柜对象。利用箱柜可以将需要处理的多个元件组合成一个逻辑元件,由于不再需要对箱柜中的元件逐个进行操作,因此能够很容易地利用它来构造更加复杂的管道。在 GStreamer 框架中使用箱柜还有另外一个优点,那就是它会试着对数据流进行优化,这对于多媒体应用来讲是很具吸引力的。
  
  图3描述了箱柜在 GStreamer 框架中的典型结构:
  
  
图3

  
 

  在 GStreamer 应用程序中使用的箱柜主要有两种类型:
  - GstPipeline 管道是最常用到的容器,对于一个 GStreamer 应用程序来讲,其顶层箱柜必须是一条管道。
  - GstThread 线程的作用在于能够提供同步处理能力,如果 GStreamer 应用程序需要进行严格的音视频同步,一般都需要用到这种类型的箱柜。
  
  GStreamer 框架提供了两种方法来创建箱柜:一种是借助工厂方法,另一种则是使用特定的函数。下
  • 上一篇Linux:

  • 下一篇Linux:
  • 最 新 热 门
     VMware下Linux与真实主机共享上网
     Linux系统安全隐患及加强安全管理方法
     各类Unix和Linux密码丢失解决方法
     配置Linux操作系统的环境变量
     在Linux系统下刷新主板BIOS的好方法
     删除文件提示:Operation not permitted
     Linux系统下硬盘挂载详细说明
     Linux文本模式下如何发送带附件的Email
     在Linux自动生成一个保险密码的方法
     Linux商业电影动画制作软件列表
    最 新 推 荐
     Linux Shell中强大的正则grep
     Linux Shell脚本Ldd命令原理使用方法
     保持进程在Shell退出后能继续运行方法
     Linux Shell下后台运行及其前台的转换
     Bash的另类shell Makefile
     shell下的编程vim+ctags+taglist (ubuntu)
     Linux Shell脚本Ldd命令原理及使用方法
     用Shell写DEAMON后台来控制安全访问的方法
     Shell脚本显示当前网络连接与对应物理地址
     Shell脚本 实现vi/cp/mv前自动备份源文件
    相 关 文 章

    08年IT市场预测 Linux将猛挖Vista墙角
    Windows Vista用最小镜像引导Linux系统
    如何利用Grub命令启动损坏的Linux系统
    Linux系统下用Sopcast收看网络电视
    在Ubuntu和Debian系统下安装PostgreSQL
    从网络上登录其它计算机的PostgreSQL
    使用Testdisk恢复Linux系统硬盘分区
    MYSQL:解决主机host_name被屏蔽的现象
    Windows Vista与Ubuntu Linux系统双启动
    Windows与Linux系统共享StarDict字典文件

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    本网站所有内容未经许可不得转载或做其他使用