Gstreamer插件教程1.1—介绍(Introduction):前言(Preface)

英文原文:https://gstreamer.freedesktop.org/documentation/plugin-development/introduction/preface.html

Gstreamer是什么?

Gstreamer是一个创建流媒体应用的框架。基本的设计源自于奥立冈州立大学商学研究院关于视频流的研究,同时也引进了DirectShow的思想。

基于Gstreamer的开发框架,使得编写一个包含各种类型流媒体的应用成为了可能。Gstreamer的设计目的是为了能够更容易地编写一个处理音频及视频等的多媒体应用程序。它不局限于音频和视频,还能处理任何类型的数据流。Gstreamer中pipeline的设计是为了使得(所应用过滤器导致的)开销最小。这使得Gstreamer成为对设计延时和性能要求高的高端音频应用的一个很好的框架。

最明显的一个关于Gstreamer的应用是构建一个媒体播放器。Gstreamer已经包含了一些构建媒体播放器所需要的组件,这些组件支持非常多的格式,如MP3, Ogg/Vorbis, MPEG-1/2, AVI, Quiktime, mod等等。然而,Gstreamer并不仅仅是一个媒体播放器。它的主要优势在于可插拔式组件,此组件可混合并适配到任意的pipeline中,使得其能够写出一个完备的可编辑式应用。

基于插件的Gstreamer框架将提供多种编解码及其它功能。插件能够被链接到pipeline中,而pipeline定义了数据的流向。

Gstreamer的核心功能是提供一个框架,此框架可加入插件,定义了数据流向,同步机制及媒体类型处理/接洽。同时,它还提供了用于编写应用程序所需的API。

谁应该阅读此教程

此教程阐释了如何为Gstreamer写一个新的模块。以下几种类型的开发人员需要阅读此教程:

  • 任何想通过新的方式来处理Gstreamer中数据的人。如团队中的某位开发人员,想要创建一个新的数据格式转换器,一个新的可视化工具,或一个新的编解码器。
  • 任何想让Gstreamer支持新的输入或输出设备的人。如团队中的某位开发人员,想让Gstreamer支持一个新的视频输出,从一个数字摄像头或特殊的麦克风中读取数据等。
  • 任何想通过任何方式扩展Gstreamer的人。在了解插件系统的局限性之前,你需要理解插件系统是如何工作的。同时,当你阅读了此教程,你可能会惊讶插件所能做的事。
如果你仅仅想使用Gstreamer中已存在的功能,或者你只是想使用应用了Gstreamer的应用程序,此教程并不适合你。如果你只想用Gstreamer中已存在的插件来编写应用程序—Gstreamer中已经包含了许多插件—你可能想要阅读的是 Gstreamer应用开发手册。如果你只想获得一个Gstreamer应用程序的帮助,那你应该查看用户手册中对应的那部分。

读前准备

此教程假设你已经对Gstreamer基本的工作方式有了一定的了解。对于Gstreamer的编程概念,你可能需要先阅读Gstreamer应用开发手册,同时在Gstreamer网页上查看其它相关的教程。

为了能够理解此教程,你应该需要拥有基本的C语言知识。由于 Gstreamer遵守GObject编程方式,此教程也假设你了解基本的GObject编程。你也可能想阅读Eric Harlow的书籍<>。

此教程的结构

为了帮助你导读此教程,此教程被分成了几个大的部分。每个部分处理了Gstreamer插件开发中的特定部分。此教程的各个部分将以以下的顺序进行展示:

  • 构建一个插件 - 通过讲解一个音频过滤器,介绍插件结构。

此部分包含了你构建一个插件需要的所有步骤,如在Gstreamer中注册一个Element并设置,使其能够接收及发送数据给与其连接的Element。此介绍一开始将给出一个生成基本的结构并注册一个Element的例子(教程:Constructing the Boilerplate)。接着,你将学会如何编写代码来获得一个基本的过滤插件(教程:Specifying the pads,The chain function and What are states?)。

然后,我们将介绍一些GObject是如何使得应用程序中Element可配置的概念,以及如何进行应用程序与Element的交互(教程:Adding Properties and Signals)。接着,你将学会构建一个快速测试应用程序用于测试所有你在Building a Test Application所学的内容。在这部分,我们将只涉及这些基本的内容。对于成熟的应用开发,你应该查看Gstreamer应用开发手册。

  • 高级过滤器概念 - 关于Gstreamer插件开发中高级特征的信息。
通过前面基本的学习,你应该能够创建一个多功能且性能良好的音频或视频过滤插件。然而,Gstreamer为插件编写者提供了更多。此部分教程包含了插件编写的高级主题,如时间安排,媒体类型定义,时钟,接口及标签等。由于这些特征都有其特殊的目的,你可以以任意的顺序去阅读对应教程,它们中的大多数不要求先阅读其它章节。
第一个章节( 不同的时间安排模式)将阐述Element时间安排的一些基础内容。虽然它不是非常的深入,但它会或多或少地介绍为什么会是如此工作的。如果你对Gstreamer的内容机制感兴趣,可以阅读此章节。接着,我们将运用此部分知识并讨论另一种类型的数据传输(而不是你在 The chain function: Different scheduling modes章节所了解的那样)。基于循环的Element将使你更好地控制输入速率。这对写一些插件,如整流器和分流器,将非常有用。
接下来,我们将讨论Gstreamer中的媒体定义(教程: Media Types and Properties)。你将学会如何定义一个新的媒体类型及了解Gstreamer中已定义的一系列媒体类型。
在下一个章节,你将学习request-和sometimes-pads,这些pads是动态创建的,或者是应用程序所需要的(request-pads),或者是媒体流所需要的(sometimes),这在 Request and Sometimes pads教程中有介绍。
下一个章节,时钟,将阐述Gstreamer中时钟的概念。当你想知道Element如何实现音频/视频的同步时,你需要了解此内容。
接下来的几个章节将会讨论应用程序与Element交互的高级方式。在之前,我们学习了GObject的方式来交互(教程 Adding Properties and  Signals)。我们将讨论动态参数,这是一种提前定义好Element行为的方式(教程: Supporting Dynamic Parameters)。接着,你将学习接口(教程: interfaces)。接口是应用程序与Element交互中目的明确的一种方式,它是基于GObject的接口的。最后,你将学习Gstreamer中元数据是如何被处理的(教程: Tagging(Metadata and Streaminfo)。
最后一章节, Element:搜索,导向等更多,将讨论Gstreamer中Events的概念。Events是应用程序与Element交互的另外一种方式。它们主要关心搜索。它们也是Elements之间进行交互的一种方式,如令彼此知道媒体流的间断点,在pipeline中向前传递tags等等。
  • 经创建特殊的Element类型 - 阐述编写其它的插件类型
由于一开始教程是以音频过滤器作为例子,讲述的概念主要是应用在过滤插件上。但其中很多的概念同样可以应用到其它插件类型上,包括sources, sinks, and autopluggers。此部分的教程将展示当使用这些特殊的插件类型时会出现的问题。此章节一开始将关注能够用基本类型( Pre-made base clases)编写的Element,之后关注编写特殊类型的Element(教程: Writing a Demuxer or Parser, Writing a N-to-1 Element or Muxer and Writing a Manager)。
  • 附录 - 更多关于关于插件开发的信息
此附录介绍一些并不严格遵守之前关于插件构建的规则,大多数未完成。

此章节所剩余的部分会简介涉及到Gstreamer插件开发的基本概念。包含了Elements and Plugins,Pads,GstMiniObject, Buffers and Events and Media types and Properties。如果你已经对这些内容很熟悉了,你可通过此部分来回顾之前的内容,或者你可略过此部分,直接看Building a Plugin。

正如你所看到的,此教程有许多内容需要学习,所以,让我们开始吧!

  • 通过扩展GstBin,创建混合的,复杂的Element。这将使得你能够创建(其它插件嵌入到里面的)插件。
  • 添加新的媒体类型及类型检测到注册表中。这将使得你的插件能够在一个全新的媒体类型中工作。

你可能感兴趣的:(Gstreamer,gst,gstreamer,plugin,writer,教程,基础入门)