当前位置:
文档之家› GStreamer插件开发指南
GStreamer插件开发指南
GStreamer 框架是基于插件的, 有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了 其他的功能。所有的插件都能够被链接到任意的已经定义了的数据流管道中。GStreamer 的管道能够被 GUI 编辑器编辑, 能够以 XML 文件来保存。这样的设计使得管道程序库的消耗变得非常少。
GStreamer 核心库函数是一个处理插件、数据流和媒体操作的框架。GStreamer 核心库还提供了一个 API, 这个 API 是开放给程序员使用的---当程序员需要使用其他的插件来编写他所需要的应用程序的时候可 以使用它。
• 附录 ── 关于插件开发的进一步信息
附录中包含一些不适合在手册的其它章节讲述的信息,这些大部分还没有完成。
手册的剩余部分总揽了 GStreamer 插件开发中的基本概念,涵盖的内容包括元件(Elements)和插件 (Plugins), 衬垫, 数据(Data),缓冲区(Buffers)和事件(Events)和 类型和属性。如果你已 经熟悉了对这一部分,你可以将之当作一次回顾,或者直接跳到编写一个插件。
接着,在 Chapter 14,将解释 GStreamer 中的时钟概念。如果你的 element 中需要同步音视频, 你必须知道这些信息。
接下来的几章,我们将讨论应用程序和 element 进行交互的高级方法。之前,我们在添加参数 和 Chapter 8 中学会了如何通过 GObject 的方法来完成这一功能。我们将在 Chapter 15 中讨论动态 参数,这是一种预先定义 element 行为的方法。下一步,我们会在 Chapter 17 中学习到接口的 方方面面。接口是个非常特别的东西-应用级元件的特定方式,基于 GObject 的 GInterface 之上。 最后,你将在 Chapter 18 中学到 GStreamer 是怎样处理元数据的。
1.2. 谁应该读该指南?
该指南叙述了如何为 GStreamer 编写新的模块。本指南针对以下几种人:
• 那些想给 GStreamer 增数据类型转换器,或者新的编码器或者解码器。
• 那些想支持新的输入输出设备的人。例如:某人可能会想增加将数据输出到新的视频输出系统或 从一个数码相机或耳机中读取数据的功能。
本手册旨在帮助你了解 GStreamer 的框架 0.10.9.1 版)以便你能够开发新的插件来扩展当前的功能。 本手册通过用 C 语言开发一个示例插件──一个音频过滤器──来定位大多数问题。然而,接下来的部 分会通过编写其它类型的插件引入另一些问题,在本手册的结尾介绍了一些 GStreamer 的 Python 绑定。
GStreamer 插件开发指南 (0.10.9.1)
I. 介绍
GStreamer 是一个用来创建流媒体应用程序的非常强大和通用的框架。GStreamer 框架的许多优点来源 于它的模块性 :GStreamer 可以无缝地接纳新的插件模块。但是由于模块性和强大的功能通常以极高的 复杂性为代价(例如 CORBA),编写一个新的插件并不总是一件简单的事。
滤镜是一类处理流数据的重要插件。数据的生产者和消费者分别被称为 source 和 sink 元件。箱柜(Bin) 元件可以包含其它的元件。箱柜的主要职责是调度它包含的元件并使得数据流更平滑。热插拔 (autoplugger)元件是另一种箱柜,它可以动态的加载其它元件,并将它们连接起了形成一个可以处 理两个任意流的滤镜。
在该部分的第一章不同的调度模式 我们将解释一些 element 调度的基本知识。这部分不会很深 入,只是一种介绍性的阐述为什么那些东西会那样工作。如果你对 GStreamer 的内部感兴趣,请 阅读这一章。接下来,我们将这一知识运用于另一种类型的数据传输 Chapter 5:不同的调度模 式基于环路的(Loop-based)元件将让你能对其输入速率有更多的控制。这些在编写 muxers 或 demuxers 时是很有用的。
2.3.1. 缓冲区分配 2.4. MIME 类型(Mimetypes)和属性
2.4.1. 基本类型
Chapter 1. 前言
1.1. GStreamer 是什么?
GStreamer 是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关 视频管道的创意, 同时也借鉴了 DirectShow 的设计思想。
在最后一章,Chapter 19 中,将讨论 GStreamer 的事件机制。一方面,事件也是应用程序和 element 间交互的方法,例如定位事件。另一方面,事件也是 element 间进行交互的一种方法,例如,element 可以通过事件传递媒体流断开的状况,在管道内转发标签等等。
• 创建特殊类型的元件 ── 编写其它类型的插件
正如你所见,我们有许多的东西需要学习,让我们就此开始吧!
• 通过扩展 GstBin 创建复杂的 element,这样可以创建包含其它插件的插件。 • 通过在类型侦测函数(typedetect functions)中加入新的 mime 类型,可以让你的插件处理全
新的媒体类型。
Chapter 2. 基础概念介绍
• 高阶滤镜概念 ── GStreamer 插件开发的高级特性信息。
通过对初步知识的学习,你应该能够创建一个有很好的特性的音频或视频过滤器插件了。然而, GStreamer 为插件编写者提供了更多的东西。这一部分的章节包含了一些更高级的主题。例如调 度,GStreamer 的类型定义,时钟,接口和标签。因为这些特性是针对特定应用的 (purpose-specific),你可以按任何顺序阅读它们,它们大多不依赖于其他章节的知识。
目录 1. 前言
1.1. GStreamer 是什么? 1.2. 谁应该读该指南? 1.3. 预备知识 1.4. 该指南的结构 2. 基本知识 2.1. 元件(Elements)和插件(Plugins) 2.2. 衬垫(Pads) 2.3. 数据(Data),缓冲区(Buffers)和事件(Events)
1.3. 预备知识
该指南假定你已经稍微了解了 GStreamer 的基本工作原理。你也许希望首先阅读《GStreamer 应用程序 开发手册》,以便获得对 GStreamer 编程概念的了解。另外,不要忘了查看 GStreamer 网站上的已有文 档。
为了理解这份手册,你必须对 C 语言有一个基本的了解。因为 GStreamer 是基于 GObject 编程模型,所 以本指南假定你也已经对 GObject 编程有了一个基本的了解。你或许也想看一下 Eric Harlow's 的 《Developing Linux Applications with GTK+ and GDK》一书。
随后,在增加参数和 Chapter 8 中,我们将演示如何使用 GObject 使 element 在程序中可配置, 以及怎样使你的程序和 element 交互。下一步,你将学习如何快速的创建一个测试程序来测试你 在 Chapter 9 所学的所有知识。这里只涉及一些应用程序开发的基本知识,要想对此有一个全面 的了解,请查看应用程序开发手册。
下一步,我们将在 Chapter 12 中讨论 GStreamer 媒体标识。你将学到怎样定义新的媒体类型及 得到 GStreamer 内部的标准媒体类型列表。
在下一章,你将学习 request-pads 和 sometimes-pads 的概念,这些 pad 都是动态创建的, 或 者是因为应用程序的需要(request),或者是因为媒体类型的要求(sometimes),这些都将在 Chapter 13 中叙述。
• 那些想通过任何方法扩展 GStreamer 的人。你必须事先了解插件系统是如何工作的,这样你才能 知道插件系统对其它代码有什么限制。读完了该手册,你也许会因为插件可以做如此多的事而感 到惊讶。
如果你只是想使用 GStreamer 的已有功能,或者只想使用那些基于 GStreamer 程序,那么你可以不用再 看下去了。如果你只关注与使用现有的插件去便写新的程序──现在有许多这样的插件──你也许想看 的是《GStreamer 应用程序开发手册》如果你只是想获得那些基于 GStreamer 的程序的帮助,那么你应 该查看那些程序的用户手册。
GStreamer 最显著的用途是在构建一个播放器上。GStreamer 已经支持很多格式的文件了, 包括:MP3, Ogg/Vorbis, MPEG-1/2, AVI, Quicktime, mod 等等。从这个角度看,GStreamer 更象是一个播放器。但 是它主要的优点确是在于: 它的可插入组件能够很方便的接入到任意的管道当中。这个优点使得利用 GStreamer 编写一个万能的可编辑音视频应用程序成为可能。
由于前两部分以一个音频过滤器为例,所介绍的概念可以运用到过滤器插件的开发中。同时许多 概念也可以运用到 sources,sinks 和 autopluggers 等其它类型的插件中。这一部分讨论编写其 他特定类型的插件会碰到的问题。本章开始将焦点集中在可以使用基类(Pre-made base classes) 编写的 element 上。接下来,在 写一个 Demuxer 或 Parser, 写一个 N-to-1 元件或 Muxer 和写 一个管理器中,讨论编写特殊的元件。
1.4. 该指南的结构
为了帮助你驾驭这份指南,我们将其分为几个大的部分。每一部分致力于一个特定的 GStreamer 插件开 发相关的广泛概念。该指南的所有部分按照以下顺序组织:
• 编写一个插件 ── 介绍插件的结构,并用一个音频滤镜作为演示。
这一部分涵盖了编写一个插件的所有基本步骤,例如将 element 注册到 GStreamer 并进行一些初 步设置以便能和相邻的 element 互传数据。讨论以一个示例程序开始,该程序创建一些基本的结 构并在构建样板一节中注册一个 element。接着,你将在 Chapter 4, Chapter 5 和 Chapter 6 中 学会怎样通过一段代码得到一个基本的滤镜插件。