目录I.介绍………………………………………………………………………………………41.前言…………………………………………………………………………………51.1.GStreamer是什么?…………………………………………………………51.2.谁应该读该指南?……………………………………………………………51.3.预备知识……………………………………………………………………61.4.该指南的结构………………………………………………………………62.基础…………………………………………………………………………………92.1.元件(Elements)和插件(Plugins)……………………………………92.2.衬垫(Pads)………………………………………………………………92.3.数据(Data),缓冲区(Buffers)和事件(Events)………………102.4.MIME类型(Mimetypes)和属性…………………………………………11II.编写一个插件…………………………………………………………………………133.构建样板(Boilerplate)………………………………………………………143.1.获取GStreamer插件模板…………………………………………………143.2.使用项目戳(ProjectStamp)…………………………………………143.3.检查基本代码………………………………………………………………153.4.GstElementDetails………………………………………………………163.5.GstStaticPadTemplate……………………………………………………173.6.构造函数……………………………………………………………………193.7.Plugin_init函数…………………………………………………………194.指定衬垫(pads)…………………………………………………………………214.1.Setcaps-函数………………………………………………………………225.链函数(Thechainfunction)…………………………………………………246.什么是状态?………………………………………………………………………266.1.管理滤镜的状态……………………………………………………………267.添加参数……………………………………………………………………………298.信号…………………………………………………………………………………329.编写测试程序………………………………………………………………………33III.高阶滤镜概念…………………………………………………………………………3610.Caps协商(negotiation)………………………………………………………3710.1.Caps协商实例……………………………………………………………3710.2.固定caps…………………………………………………………………3810.3.下游caps协商……………………………………………………………3810.4.上游caps(再)协商……………………………………………………4110.5.实现一个getcaps函数…………………………………………………4211.不同的调度模式…………………………………………………………………4311.1.衬垫(Pad)激活时机…………………………………………………4311.2.衬垫(Pads)驱动管道(pipeline)…………………………………4411.3.提供随机访问……………………………………………………………4712.类型和属性………………………………………………………………………4912.1.创建一个简单的格式来测试……………………………………………4912.2.Typefind函数和Autoplugging………………………………………4912.3.已定义类型列表…………………………………………………………51PDF文件使用pdfFactoryPro试用版本创建插件开发手册————————lenove内部使用————————213.请求(Request)和间或(Sometimes)衬垫(pads)………………………6413.1.间或衬垫…………………………………………………………………6413.2.请求衬垫…………………………………………………………………6814.时钟机制(Clocking)…………………………………………………………7014.1.时间格式…………………………………………………………………7014.2.时钟(Clocks)…………………………………………………………7014.3.在元件(elements)和时间里的数据流………………………………7014.4.每个元件的义务…………………………………………………………7115.支持动态参数……………………………………………………………………7215.1.开始………………………………………………………………………7215.2.数据处理循环……………………………………………………………7216.MIDI………………………………………………………………………………7417.接口………………………………………………………………………………7517.1.怎样实现接口……………………………………………………………7517.2.URI接口…………………………………………………………………7617.3.Mixer接口………………………………………………………………7717.4.Tuner接口………………………………………………………………8017.5.颜色平衡(ColorBalance)接口……………………………………8317.6.属性探测(PropertyProbe)接口……………………………………8317.7.XOverlay接口………………………………………………………8717.8.导航(Navigation)接口………………………………………………8918.标签(元数据和流信息)………………………………………………………9018.1.从流中读取标签…………………………………………………………9018.2.将标签写入流……………………………………………………………9219.事件:定位,导航及更多………………………………………………………9619.1.下游事件…………………………………………………………………9619.2.上游事件…………………………………………………………………9719.3.事件汇总…………………………………………………………………98IV.创建特殊类型的元件………………………………………………………………10220.Pre-made基类…………………………………………………………………10320.1.编写一个sink…………………………………………………………10320.2.编写一个源(source)………………………………………………10520.3.编写一个转换元件(transformationelement)………………10621.编写一个分流器(Demuxer)或解析器(Parser)………………………10722.编写一个N-to-1元件或混合器(Muxer)…………………………………10823.编写一个管理器(Manager)………………………………………………109V.附录…………………………………………………………………………………11024.编写一个元件该检查的方方面面……………………………………………11124.1.关于状态………………………………………………………………11124.2.调试……………………………………………………………………11124.3.查询,事件及相关……………………………………………………11224.4.测试你的元件…………………………………………………………11225.将0.8的插件移植到0.9…………………………………………………114PDF文件使用pdfFactoryPro试用版本创建插件开发手册————————lenove内部使用————————325.1.变更列表………………………………………………………………11426.GStreamer许可……………………………………………………………11626.1.如何为你给GStreamer所写的代码加许可……………………116PDF文件使用pdfFactoryPro试用版本创建插件开发手册————————lenove内部使用————————4I.介绍GStreamer是一个用来创建流媒体应用程序的非常强大和通用的框架。GStreamer框架的许多优点来源于它的模块性:GStreamer可以无缝地接纳新的插件模块。但是由于模块性和强大的功能通常以极高的复杂性为代价(例如CORBA),编写一个新的插件并不总是一件简单的事。本手册旨在帮助你了解GStreamer的框架0.10.9.1版)以便你能够开发新的插件来扩展当前的功能。本手册通过用C语言开发一个示例插件──一个音频过滤器──来定位大多数问题。然而,接下来的部分会通过编写其它类型的插件引入另一些问题,在本手册的结尾介绍了一些GStreamer的Python绑定。PDF文件使用pdfFactoryPro试用版本创建插件开发手册————————lenove内部使用————————5Chapter1.前言1.1.GStreamer是什么?GStreamer是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意,同时也借鉴了DirectShow的设计思想。GStreamer的开发框架使它有可能被用来编写任何类型的流媒体应用程序。基于GStreamer的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。在编写处理音频、视频或者两者皆有的应用程序时,GStreamer可以让你的工作变得简单。GStreamer并不受限于音频和视频处理,它能够处理任意类型的数据流。管道的设计对于一般应用的滤镜(filter)绰绰有余。这使得GStreamer成为一个优秀的框架,它甚至可以用来设计出对延时有很高要求的高端音频应用程序。GStreamer最显著的用途是在构建一个播放器上。GStreamer已经支持很多格式的文件了,包括:MP3,Ogg/Vorbis,MPEG-1/2,AVI,Quicktime,mod等等。从这个角度看,GStreamer更象是一个播放器。但是它主要的优点确是在于:它的可插入组件能够很方便的接入到任意的管道当中。这个优点使得利用GStreamer编写一个万能的可编辑音视频应用程序成为可能。GStreamer框架是基于插件的,有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了其他的功能。所有的插件都能够被链接到任意的已经定义了的数据流管道中。GStreamer的管道能够被GUI编辑器编辑,能够以XML文件来保存。这样的设计使得管道程序库的消耗变得非常少。GStreamer核心库函数是一个处理插件、数据流和媒体操作的框架。GStreamer核心库还提供了一个API,这个API是开放给程序员使用的---当程序员需要使用其他的插件来编写他所需要的应用程序的时候可以使用它。1.2.谁应该读该指南?该指南叙述了如何为GStreamer编写新的模块。本指南针对以下几种人:•那些想给GStreamer增加新的数据处理方法的人。例如,可能有人想创建一个新的可见的工具---数据类型转换器,或者新的编码器或者解码器。•那些想支持新的输入输出设备的人。例如:某人可能会想增加将数