gstreamer手册(简体中文版)

合集下载

PythonGstreamer入门

PythonGstreamer入门

PythonGstreamer入门历时一个月的Python Gstreamer入门阶段接近尾声,在这里总结一下自己的学习历程。

首先感谢一下Andy同学和Stephen老师的帮助和指导。

(根据后续学习持续更新)1.基础知识学习阶段首先需要了解Gstreamer是什么,有哪些基本的内容,element、pad、bin、pipeline各是什么,其中又有哪些分类。

这里推荐Gsteamer的官方文档进行学习,可以去Gstreamer官网寻找英文文档,也可以直接搜索Gstreamer应用开发手册寻找中文版。

Gstreamer是使用C语言编写的框架,网络上关于Gstreamer的资料也是C语言编写居多(这也是我想写一篇自己的Python Gstreamer 学习历程的原因之一),不过不管是什么语言编写Gstreamer程序,基本的思路都是一样的,只是语句的表达方式不同而已,关于C语言和Python语言的函数对照表我后面也有提供。

这里推荐一个翻译的Gstreamer基础教程、播放教程博客:Gstreamer基础教程常用知识总结:gstreamer知识总结2.播放功能实现思路想要播放视频首先需要理解视频音频的编码与封装相关知识,这里推荐一个视音频编解码相关博客:视音频编解码技术零基础学习方法一个mkv视频的形成过程为:视音频原始数据——>音视频编码形成压缩数据——>音视频封装为MKV等格式视频。

相对应的我们播放一个视频就需要对这个过程翻转:MKV视频——>解封装——>解码——>播放。

图解:3.播放功能代码实现与资料对于Gstreamer的安装,Ubuntu可能会自带1.0版本,如果查找不到部分元件,可以搜索这些元件所属的插件包,这里提供一个元件和Gstreamer插件包对应的文档:gstreamer插件下面根据顺序介绍一下我编写代码的过程以及部分代码:(1)使用playbin实现对音视频的播放playbin是一个集成的箱柜可以直接用来播放多种音视频。

gstreamer plugin process

gstreamer plugin process

Gstreamer Plugin创建全过程(以filesink插件为例)Gstreamer中pad支持两种schedule方式:docs/design/part-activation.txtpush-based scheduling: 这种scheduling方法中,downstream elements的sink pad上需要定义chain函数(gst_pad_set_chain_function ),upstream elements调用这个chain函数来完成将buffer从upstream(source pad)到downstream elements(sink pad)的传递。

这种scheduling方式中source elements递归调用downstream elements的chain函数,最后一直调用到目的elements的才能函数。

(由于chain函数是定义在sink pad上,而source element是没有sink pad的,因此source element是不提供chain函数的).调用的顺序是从sink element到source element。

(递归调用).在这种模式下,upstream elements通过调用downstream elements sink pad上定义的chain函数主动的将数据传输给downstream elements,因此数据驱动是由upstream element发起的。

一. 创建插件模板gst-launch和gst-inspect是开发插件中比较重要的两个工具。

其中,gst-inspcet用来查看插件信息以及检测插件是否创建成功。

gst-launch用来播放插件命令。

如:gst-launch-1.0 filesrclocation=/home/ssl/music.mp3 ! mad ! filesink ! autoaudiosink (其中filesink是我们自己创建的插件模板或者插件)(一般情况下,初步安装成功的ubuntu系统都会自带gstreamer-0.10版本,但是有写基础的插件等都需要安装。

gstreamer-core解析

gstreamer-core解析

介绍:这片文档是基于gstreamer-0.10.35来讲的,详细介绍了gstreamer core里面提供的功能。

如有问题请联系****************,转载请标明出处。

GStreamer概念是一个用来创建流媒体应用程序的非常强大和通用的框架,框架是基于插件的, 这些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了其他的功能。

所有的插件都能够被链接到任意的已经定义了的数据流管道中。

GStreamer的管道能够被GUI编辑器编辑, 能够以XML文件来保存。

这样的设计使得管道程序库的消耗变得非常少。

Gstreamer core作用GStreamer内核的本质是media-agnostic(不关心媒体类型),core/plugins是分离。

我们了解的仅仅是字节和块,以及包含基本的元件,GStreamer内核的强大功能甚至能够实现底层系统工具,像cp,核心库函数是一个处理插件、数据流和媒体操作的框架。

所有的媒体处理功能都是由插件从外部提供给内核的,并告诉内核如何去处理特定的媒体类型。

GStreamer核心库还提供了一系列API, API是开放给程序员使用的---当程序员需要使用其他的插件来编写他所需要的应用程序的时候可以使用它。

元件和插件在插件的开发中,一个元件就是继承于GstElement 的一个对象。

元件在与其他元件连接时提供了如下一些功能:例如,一个源元件为一个流提供数据,一个滤镜元件对流中的数据进行操作。

没有了元件,GStreamer 只是一堆概念性的管道,没有任何东西可供连接。

GStreamer已经自带了一大堆元件,但是我们仍然可以编写额外的元件。

然而,仅仅写一个新的元件并不够,为了使GStreame r 能够使用它,你必须将元件封装到一个插件中。

一个插件是一块可以加载的代码,通常被称为共享对象文件(shared object file)或动态链接库(dynamically linked library)。

Gstreamer

Gstreamer

Gstreamer的一些基本概念与A/V同步分析一、媒体流(streams)流线程中包含事件和缓存如下:-events-NEW_SEGMENT (NS)-EOS (EOS) *-TAG (T)-buffers (B) *其中标*号的需要同时钟进行同步。

典型的流如图1所示:图1媒体流组成图(1)NEW_SEGMENT,rate, start/stop, time包括了有效的时间戳范围(start/stop);stream_time; 需要的回放率以及已经应用的回放率。

(2)Buffers只有处于NEW_SEGMENT的start和stop之间的buffers是可以被显示的,否则将被丢弃或者裁剪。

running_time的计算:if(NS.rate > 0.0)running_time= (B.timestamp - NS.start) / NS.abs_rate + NS.accumelserunning_time= (NS.stop - B.timestamp) / NS.abs_rate + NS.accumstream_time的计算:stream_time= (B.timestamp - NS.start) * NS.abs_applied_rate + NS.time(3)EOS数据的结束。

二、几个时钟概念1、clock time(absolute_time): 管道维护的一个全局时钟,是一个以纳秒为单位单调递增的时钟时间。

可以通过gst_clock_get_time()函数获取。

如果管道中没有元素提供时钟,则使用该系统时钟。

2、base time: 媒体从0开始时全局的时间值。

可以通过_get_time()函数获取。

3、Running time: 媒体处于PLA YING状态时流逝的时间。

4、stream time: 媒体播放的位置(在整个媒体流中)。

如图2所示。

图2 Gstreamer时钟和变量图(引自Gstreamer文档)由此可以得出:running_time = clock_time - base_time;如果媒体流按照同一频率从开始到结束运行,那么running_time == stream_time;Running time的详细计算:running_time是基于管道所选的时钟的,它代表了媒体处于PLAYING状态的总时间,如表1所示。

安装gstreamer到ARMv6平台

安装gstreamer到ARMv6平台

安装gstreamer到ARMv6平台安装gstreamer到ARMv6平台PC linux是Ubuntu8.10。

(1)当然是安装交叉编译环境,我用的是CodeSourcery(同事那里copy过来的,可以免费下载的)。

解压以后是一个arm-2008q3-72-arm-none-linux-gnueabi.bin可以直接运行(它需要一个java虚拟机)。

安装过程中犯了一个错误,这个安装文件文件不能在远程登陆界面运行(因为安装过程有图形界面)。

默认安装完以后,在/root下有一个CodeSourcery目录, arm gcc就安装在这个目录下。

为了可以在任何目录下运行交叉编译器。

在环境变量中增加/root/CodeSourcery/Sourcery_G++_Lite/bin。

(2)交叉编译安装glib和libxml2(因为gstreamer依赖于这两个库)。

glib可以到gtk的官方网站下载,我下载的是2.20.4版本。

libxml2 Google或者baidu一下就可以下到了,我下的是2.6.26。

创建一个文件夹/root/gstreamer_lib_for_arm,glib和libxml2库就安装到这个目录下。

下面开始交叉编译glib,把glib-2.20.4.tar.gz copy到/root下,解压,进入glib-2.20.4,用下面的命令执行configure动作:CC=arm-none-linux-gnueabi-gcc ./configure --build=i686-linux --host=arm-none-linux-gnueabi--prefix=/root/gstreamer_lib_for_armglib_cv_stack_grows=no glib_cv_uscore=noac_cv_func_posix_getpwuid_r=yesac_cv_func_posix_getgrgid_r=yes ac_cv_lib_rt_clock_gettime=no glib_cv_monotonic_clock=yes这个命令我也是google上搜索到的(忘了是哪个大侠写,真是对不起这位大侠了),意思好像是:CC=arm-none-linux-gnueabi-gcc :指定使用arm-none-linux-gnueabi-gcc 作为编译器;--build=i686-linux :我们是在686计算机的linux操作系统上进行编译;--host=arm-none-linux-gnueabi :我们编译出来的东西要在arm平台的linux系统下运行;--prefix=/root/gstreamer_lib_for_arm :编译出来的目标文件安装到哪个目录;剩下的参数不懂;这个configure的过程会出好几个错误,依赖库gettext,flex,bison找不到,这些库是在编译的时候用到,直接下载相应的ubuntu 的i386(我的PC不是AMD CPU)的deb软件包安装就可以了。

gstreamer手册(简体中文版)

gstreamer手册(简体中文版)

第1章. 序言本章将从技术的角度来描述本手册的总体结构。

1.1. GStreamer是什么?GStreamer是一个创建流媒体应用程序的框架。

其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。

GStreamer的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。

在编写处理音频、视频或者两者皆有的应用程序时, GStreamer可以让你的工作变得简单。

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的开发库以及工具来编写一个基于GStreamer的应用程序。

gstreamer源码编译安装

gstreamer源码编译安装

gstreamer源码编译安装1.⾸先搭建 Gstreamer 所需环境 (1).先安装Gstreamer所需的程序包:1 sudo apt-get update2 sudo apt-get install -y bison flex libffi-dev libmount-dev libpcre3 libpcre3-dev zlib1g-dev libssl-dev gtk-doc-tools(2).安装 ORC ⽀持库,编译 gst-plugins-base 将会依赖这个库下载安装包地址:运⾏以下命令进⾏解压缩和编译安装:1 $tar xvJf orc-0.4.27.tar.xz2 $cd orc-0.4.273 $./autogen.sh --prefix=/usr/lib4 $make -j65 $sudo make install(3).安装 GLIB ⽀持库下载安装包地址:运⾏以下命令进⾏解压缩和编译安装:1 $tar xvJf glib-2.52.3.tar.xz2 $cd glib-2.52.33 $./autogen.sh4 $make -j65 $sudo make install2.安装 Gstreamer 1.12.2 基础软件包(适⽤于其他版本)(1).下载以下⼏个软件源码包:(地址:)1 gstreamer-1.12.22 gst-plugins-base-1.12.23 gst-plugins-good-1.12.24 gst-plugins-bad-1.12.25 gst-plugins-ugly-1.12.26 gst-rtsp-server-1.12.2(2).编译安装gstreamer-1.12.21 $tar xvJf gstreamer-1.12.2.tar.xz2 $cd gstreamer-1.12.23 $ ./configure4 $make -j65 $sudo make install(3).编译安装gst-plugins-base-1.12.21 $tar xvJf gst-plugins-base-1.12.2.tar.xz2 $cd gst-plugins-base-1.12.23 $ ./configure4 $make -j65 $sudo make install备注:安装1.14.4版本遇到的问题和解决⽅案1 修改 gst-plugins-base/tests/icles/Makefile 中2 GST_LIBS = -L/usr/local/lib -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 $(GCOV_LIBS) INCORRECT 为:3 GST_LIBS = -L/usr/local/lib -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lgstbase-1.0 $(GCOV_LIBS) CORRECT(4).编译安装gst-plugins-good-1.12.21 $tar xvJf gst-plugins-good-1.12.2.tar.xz2 $cd gst-plugins-good-1.12.23 $ ./configure4 $make -j65 $sudo make install(5).编译安装gst-plugins-bad-1.12.21 $tar xvJf gst-plugins-bad-1.12.2.tar.xz2 $cd gst-plugins-bad-1.12.23 $ ./configure4 $make -j65 $sudo make install(6).编译安装gst-plugins-ugly-1.12.21 $sudo apt-get install libx264-dev //⽀持x264软编码插件2 $tar xvJf gst-plugins-ugly-1.12.2.tar.xz3 $cd gst-plugins-ugly-1.12.24 $ ./configure5 $make -j66 $sudo make install (7).配置Gstreamer环境1 $cd ~2 $sudo vim .bashrc(在⽂件最后新增以下内容保存退出)3 export LD_LIBRARY_PATH=/usr/local/lib4 export GST_PLUGIN_PATH=/usr/local/lib:/usr/lib/aarch64-linux-gnu/gstreamer-1.0 //此处需要根据实际的环境,不⼀定为aarch64-linux-gnu5 $source .bashrc(8).编译安装gst-rtsp-server-1.12.2(如果需要进⾏流媒体推流才进⾏安装)1 $tar xvJf gst-rtsp-server-1.12.2.tar.xz2 $cd gst-rtsp-server-1.12.23 $ ./configure4 $make -j65 $sudo make install测试指令:软编码加推流gst-launch-1.0 videotestsrc! videoconvert ! 'video/x-raw,width=320,height=240,framerate=(fraction)15' ! autovideoconvert ! x264enc ! rtph264pay ! udpsink host=192.168.1.94 port=。

gstreamer插件开发手册

gstreamer插件开发手册
目录 I. 介绍………………………………………………………………………………………4 1. 前言…………………………………………………………………………………5 1.1.GStreamer 是什么? …………………………………………………………5 1.2. 谁应该读该指南?……………………………………………………………5 1.3. 预备知识 ……………………………………………………………………6 1.4. 该指南的结构 ………………………………………………………………6 2. 基础…………………………………………………………………………………9 2.1. 元件(Elements)和插件(Plugins)……………………………………9 2.2. 衬垫(Pads) ………………………………………………………………9 2.3. 数据(Data),缓冲区(Buffers)和事件(Events) ………………10 2.4. MIME 类型(Mimetypes)和属性 …………………………………………11 II. 编写一个插件…………………………………………………………………………13 3. 构建样板(Boilerplate)………………………………………………………14 3.1. 获取 GStreamer 插件模板…………………………………………………14 3.2. 使用项目戳(Project Stamp) …………………………………………14 3.3. 检查基本代码………………………………………………………………15 3.4. GstElementDetails ………………………………………………………16 3.5. GstStaticPadTemplate……………………………………………………17 3.6. 构造函数……………………………………………………………………19 3.7. Plugin_init 函数 …………………………………………………………19 4. 指定衬垫(pads)…………………………………………………………………21 4.1. Setcaps-函数………………………………………………………………22 5. 链函数(The chain function)…………………………………………………24 6. 什么是状态? ………………………………………………………………………26 6.1. 管理滤镜的状态……………………………………………………………26 7. 添加参数……………………………………………………………………………29 8. 信号…………………………………………………………………………………32 9. 编写测试程序………………………………………………………………………33 III. 高阶滤镜概念…………………………………………………………………………36 10. Caps 协商(negotiation)………………………………………………………37 10.1. Caps 协商实例……………………………………………………………37 10.2. 固定 caps…………………………………………………………………38 10.3. 下游 caps 协商……………………………………………………………38 10.4. 上游 caps(再)协商……………………………………………………41 10.5. 实现一个 getcaps 函数…………………………………………………42 11. 不同的调度模式…………………………………………………………………43 11.1. 衬垫(Pad)激活时机…………………………………………………43 11.2. 衬垫(Pads)驱动管道(pipeline)…………………………………44 11.3. 提供随机访问……………………………………………………………47 12. 类型和属性………………………………………………………………………49 12.1. 创建一个简单的格式来测试……………………………………………49 12.2. Typefind 函数和 Autoplugging ………………………………………49 12.3. 已定义类型列表…………………………………………………………51
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第1章. 序言本章将从技术的角度来描述本手册的总体结构。

1.1. GStreamer是什么?GStreamer是一个创建流媒体应用程序的框架。

其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。

GStreamer的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。

在编写处理音频、视频或者两者皆有的应用程序时, GStreamer可以让你的工作变得简单。

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的开发库以及工具来编写一个基于GStreamer的应用程序。

对于想学习"如何编写插件"的朋友们, 我们建议你去参考<<插件编写指南(Plugin Writers Guide)>>。

1.3. 预备知识为了更好的理解本手册的内容, 你应该具备基本的C语言基础。

由于GStreamer一直采用GObject编程模式, 所以本手册也假定你已经理解了GObject的基本概念。

你可能还需要一些GTK+和GDK的知识, 这方面的知识你可以参照Eric Harlow的书Developing Linux Applications with GTK+ and GDK。

另外, 当你读完本手册后, 请读一下GStreamer Plugin Writer's Guide。

当然,你还需要关注一下其它的GStreamer文檔。

第2章. 动机和目标从历史的角度来看,Linux在多媒体方面已经远远落后于其它的操作系统。

Microsoft's Windows 和Apple's MacOS它们对多媒体设备、多媒体创作、播放和实时处理等方面已经有了很好的支持。

另一方面,Linux对多媒体应用的综合贡献比较少,这也使得Linux很难在专业级别的软件上与MS Windows 和MacOS 去竞争。

GStreamer正是为解决Linux多媒体方面当前问题而设计的。

2.1. 当前的问题我们描述了当今Linux平台下媒体处理的一些典型问题。

2.1.1. 大量的代码复制对于那些想要播放一个声音文件的Linux用户来说,他们必须搜索各种声音播放器来播放不同格式档,而在这些播放器中,大部分的都一遍又一遍地重复使用了相同的代码。

对于那些想在应用程序中嵌入视频剪辑的Linux开发人员来说,他们必须要用粗略的hacks来运行外部的视频播放器,因为没有一套可用的库提供给开发人员来创建可定制的播放器。

2.1.2. “一个目标”媒体播放器/媒体库典型的MPEG播放器可以播放MPEG视频和音频,多数的播放器实现了完整的底层构造来达到他们的唯一目标:播放。

没有一套有效的机制可以提供对于音频和视频数据过滤和效果处理,更没有制定在视频或音频数据中添加滤波器或特殊效果的任何规定。

如果你希望将MPEG-2视频流转为AVI档,那么你的最佳选择是,将所有的MPEG-2译码算法从播放器分离出来,并复制到你的AVI编码器中,因为这类算法不能简单的在应用程序之间共享。

开发人员曾经尝试着创建一个可以处理多种媒体类型的库,但由于缺乏通用的API,所以如何集成就成了重要的工作了。

因为在集成的过程中,我们需要关注一些特殊的媒体类型(avi文件,libmpeg2,...),而集成这些媒体类型文件需要一个统一的接口。

GStreamer允许将这些库与通用的API一起打包,这样就简化了集成和复用。

2.1.3. 没有统一的插件管理机制典型的播放器对于不同的媒体类型会有不同的插件,两个媒体播放器会实现各自不同的插件机制,所以编译码器不能方便的交换。

每一个典型的媒体播放器的插管理件系统是具有其特定应用程序的需求。

缺少统一的插件机制,已经严重阻碍了二进制编译码器的发展,因为没有一家公司希望将代码移植到不同的插件机制。

GStreamer当然也采用自己的插件系统,它为插件开发者提供了一个非常丰富的框架,从而保证这些插件能够广泛应用,并与其它插件能够无缝的交互。

GStreamer为插件提供的框架是非常灵活,它足以满足大多数插件的需求。

2.1.4. 拙劣的用户感因为上述问题的原因,使得应用程序开发人员将相当多的时间花在如何处理后端、插件机制等等问题上。

从而耽误了大部分的项目时间,这样就常常导致后端和用户接口都只完成了一半,于是就导致了拙劣的用户感。

2.1.5. 没有网络透明度的规定当前还没有一个底层框架出现,来允许对网络透明媒体的操作。

有趣的是,一个分布式的MPEG编码器能够复制非分布式编码器的相同的算法。

并没有关于使用GNOME和KDE桌面平台的技术的规定被制定出来,因为GNOME和KDE桌面平台本身还在改进和完善,所以很难将多媒体恰当地集成到很多用户的环境中。

注意到GStreamer还提供很多种方法,这些方法提供将GSreamer与不同的桌面系统进行集成(见附录里的集成一节),而这些方法往往都不是网络透明化。

GStreamer内核在最底层没有采用网络透明技术,只是在顶层加了作为本地使用,这就是说,创建一个核心组件的包就变得比较容易了。

GStreamer允许管道在TCP 协议上分离,使用tcp插件来实现GStreamer数据协议,这个被包含在gst-plugins 模块,目录gst/tcp2.1.6. 与Windows™的产品还存在差距我们要想看到Linux桌面系统的成功就要立足于可靠的媒体处理。

我们必须为商业编译码器和多媒体应用扫清障碍,这样Linux才能成为多媒体领域的一个选择2.2. 设计目标我们将阐述在GStreamer开发中的目标.2.2.1. 结构清晰且威力强大GStreamer提供一套清晰的接口给以下一些开发人员:•希望构建媒体管道的应用程序员。

程序员可以使用一系列强有利的工具来创建媒体管道,而不用去写一行代码,从而使得复杂的媒体控制变得非常简单。

•插件程序员。

GStreamer向插件程序员提供了简洁而简单的API来创建self-plugin(自包含)插件,同时还集成了大量的调试和跟踪机制和工具。

GStreamer也提供了一系列现实例子。

2.2.2. 面向物件的编程思想GStreamer是依附于GLib 2.0对象模型的,熟悉GLib或者旧版本的GTK+的程序员对GStreamer将会驾轻就熟。

GStreamer采用了信号与对象属性的机制。

所有对象的属性和功能都能在运行态被查询。

GStreamer与GTK+的编程方法非常相似,需要对象模型,对象所有(ownership of objects),参考计算(reference counting)...2.2.3. 灵活的可扩展性能所有的GStreamer对象都可以采用GObject继承的方法进行扩展。

所有的插件都可以被动态装载,可以独立的扩展或升级。

2.2.4. 支持插件以二进制形式发布作为共享库发布的插件能够在运行态直接加载,插件的所有属性可以由GObject 属性来设置,而无需(事实上决不)去安装插件的头档。

我们更多的关注在插件能够独立化,运行的时候还需要很多与插件相关的因素。

2.2.5. 高性能高性能主要体现在:•使用GLib的g_mem_chunk和非模块化分配算法使得内存分配尽可能最小。

•插件之间的连接非常轻型(light-weight)。

数据在管道中的传递使用最小的消耗,管道中插件之间的数据传递只会涉及指针废弃。

•提供了一套对目标内存直接进行操作的机制。

例如,插件可以向X server 共享的内存空间直接写数据,缓冲区也可以指向任意的内存,如声卡的内部硬件缓冲区。

•refcounting和写拷贝将memcpy减少到最低。

子缓冲区有效地将缓冲区分离为易于管理的块。

•使用线程联合(cothreads)减少线程消耗。

线程联合(cothreads)是简单又高速的方法来切换子程序,作为衡量最低消耗600个cpu周期的标准。

•使用特殊的插件从而支持硬件加速。

•采用带有说明的插件注册,这样的话只在实际需要使用该插件才会去装载。

•所有的判断数据都不用互斥锁。

2.2.6. 核心库与插件(core/plugins)分离GStreamer内核的本质是media-agnostic,我们了解的仅仅是字节和块,以及包含基本的组件,GStreamer内核的强大功能甚至能够实现底层系统工具,像cp。

所有的媒体处理功能都是由插件从外部提供给内核的,并告诉内核如何去处理特定的媒体类型。

2.2.7. 为多媒体数字信号编译码实验提供一个框架GStreamer成为一个简单的框架,编译码器的开发人员可以试验各种不同的算法,提高开源多媒体编译码器开发的速度,如Theora and Vorbis。

Chapter 3. 基础概念介绍本章将介绍GStreamer的基本概念。

理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念。

3.1. 组件(Elements)组件(element)是GStreamer中最重要的概念。

你可以通过创建一系列的组件(Elements),并把它们连接起来,从而让数据流在这个被连接的各个组件(Elements)之间传输。

每个组件(Elements)都有一个特殊的函数接口,对于有些组件(Elements)的函数接口它们是用于能够读取文件的数据,译码文件数据的。

相关文档
最新文档