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