gstreamer手册(简体中文版)
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创建全过程(以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-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的一些基本概念与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平台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手册(简体中文版)
第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的应用程序。
GKE3.3.2_用户手册2022
gstreamer手册(简体中文版)
gstreamer手册(简体中文版)本文由muzhonger贡献pdf文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
第 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)的函数接口它们是用于能够读取文件的数据,译码文件数据的. 而有些组件(Elements)的函数接口只是输出相应的数据到具体的设备上(例如, 声卡设备).你可以将若干个组件(Elements)连接在一起,从而创建一个管道 (pipeline)来完成一个特殊的任务,例如,媒体播放或者录音.GStreamer已经默认安装了很多有用的组件(Elements),通过使用这些组件(Elements)你能够构建一个具有多种功能的应用程序. 当然,如果你需要的话,你可以自己编写一个新的组件(Elements).对于如何编写组件(Elements)的话题在 GStreamer Plugin Writer'sGuide中有详细的说明.3.2. 箱柜(Bins)和管道(pipelines)箱柜(Bins) 是一个可以装载组件(element)的容器.管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有组件(element).因为箱柜(Bins)本身又是组件(element)的子集,所以你能够象操作普通组件(element)一样的操作一个箱柜(Bins), 通过这种方法可以降低你的应用程序的复杂度.你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins) 内部所有组件(element)的状态.箱柜(Bins)可以发送总线消息(bus messages) 给它的子集组件(element)(这些消息包括:错误消息(error messages),卷标消息(tag messages),EOS消息(EOS messages)). 管道(pipeline)是高级的箱柜(Bins). 当你设定管道的暂停或者播放状态的时候, 数据流将开始流动,并且媒体数据处理也开始处理. 一旦开始,管道将在一个单独的线程中运行,直到被停止或者数据流播放完毕.3.3. 衬垫(Pads)衬垫(Pads)在GStreamer中被用于多个组件的链接,从而让数据流能在这样的链接中流动. 一个衬垫(Pads)可以被看作是一个组件(element)插座或者端口,组件 (element)之间的链接就是依靠着衬垫(Pads).衬垫(Pads)有处理特殊数据的能力:一个衬垫(Pads)能够限制数据流类型的通过.链接成功的条件是:只有在两个衬垫(Pads)允许通过的数据类型一致的时候才被建立. 数据类型的设定使用了一个叫做caps negotiation的方法.数据类型被为一个GstCaps变数所描述. 下面的这个比喻可能对你理解衬垫(Pads)有所帮助. 一个衬垫(Pads)很象一个物理设备上的插头.例如一个家庭影院系统.一个家庭影院系统由一个放大器 (amplifier),一个DVD机,还有一个无声的视频投影组成.我们需要连接DVD机到功放(amplifier),因为两个设备都有音频插口;我们还需要连接投影机到DVD机上,因为两个设备都有视频处理插口.但我们很难将投影机与功放(amplifier) 连接起来,因为他们之间处理的是不同的插口. GStreamer衬垫(Pads)的作用跟家庭影院系统中的插口是一样的. 对于大部分情况,所有的数据流都是在链接好的元素之间流动.数据向组件(element)以外流出可以通过一个或者多个 source 衬垫(Pads),组件(element) 接受数据是通过一个或者多个sink 衬垫(Pads)来完成的. Source组件(element) 和sink组件(element)分别有且仅有一个 sink 衬垫(Pads)或者source 衬垫(Pads).数据在这里代表的是缓冲区(buffers) (GstBuffer对象描述了数据的缓冲区 (buffers) 的信息 ) 和事件 (events) (GstEvent 对象描述了数据的事件 (events)信息).1.4. 本手册结构为了帮助你更好的学习本手册, 我们将本手册分为几个大的部分, 每一部分阐述了一个在GStreamer应用程序开发过程中特殊而又有用的话题.如下所示: Part I --- GStreamer应用程序开发手册 (0.10.9.1)给你一个关于GStreamer 总的概况叙述. Part II --- GStreamer 应用程序开发手册 (0.10.9.1)阐述GStreamer应用程序开发的基本概念.本章结束后, 你将可以使用GStreamer来开发你自己的音频播放器. Part III --- GStreamer 应用程序开发手册 (0.10.9.1)我们将继续讨论一些有关GStreamer深层次的主题, 这些主题告诉了我们为什么GStreamer能在众多的竞争者当中脱颖而出. 我们将使用动态参数和动态接口来讨论应用程序中管道的交讯问题, 我们还将讨论线程同步,时钟同步,以及其它同步问题.这些问题的讨论不仅向你讲述如何使用GStreamer的API, 而且还将告诉你一些基于 GStreamer应用程序开发过程中所经常遇到的问题的解决办法, 通过这些知识的学习使你更加深刻的理解GStreamer的基本概念. Part IV --- GStreamer 应用程序开发手册(0.10.9.1)我们将进入GStreamer 的高级编程领域.你不需要对GStreamer所有的细节都了解清楚,但是基本的 GStreamer概念仍然是需要的. 我们将讨论XML, playbin, autopluggers等话题. Part V --- GStreamer 应用程序开发手册 (0.10.9.1)你将学习到一些有关 GStreamer与GNOME,KDE,OS,X或者Windows集成的知识, 当然你还将学习到一些有关调试和如何处理常见问题的方法. 通过这些知识的学习, 将更好的方便你使用GStreamer第 4 章. 初始化GStreamer当你准备写一个 GStreamer 应用程序时,你仅需要通过包含头档 gst/gst.h来访问库函数.除此之外,不要忘记初始化 GStreamer 库.4.1. 简易初始化在 GStreamer 库被使用前,主应用程序中应该先调用函数 gst_init,这个函数将会对GStreamer 库做一些必要的初始化工作,同时也能够对 GStreamer 的命令行参数进行解析.一个典型的初始化GStreamer库的代码 [1] 如下所示: 例 4-1. 初始化GStreamer#include <gst/gst.h> int main (int argc, char *argv[]) { const gchar *nano_str; guint major, minor, micro, nano; gst_init (&argc, &argv); gst_version (&major, &minor, µ, &nano); if (nano == 1) nano_str = "(CVS)"; else if (nano == 2) nano_str = "(Prerelease)"; else nano_str = ""; printf ("This program is linked against GStreamer %d.%d.%d %s\n", major, minor, micro, nano_str); return 0; }你可以使用 GST_VERSION_MAJOR, GST_VERSION_MINOR 以及GST_VERSION_MICRO 三个宏得到你的 GStreamer 版本信息,或者使用函数 gst_version 得到当前你所调用的链接库的版本信息.目前 GStreamer 使用了一种保证主要版本和次要版本中 API-/以及 ABI 兼容的策略. 当命令行参数不需要被 GStreamer 解析的时候, 你可以在调用函数gst_init 时使用 2 个 NULL 参数.4.2. 使用 GOption 接口来初始化你同样可以使用 GOption 表来初始化你的参数.例子如下: 例 4-2. 使用GOption 接口来初始化 #include <gst/gst.h> int main (int argc, char *argv[]) { gboolean silent = FALSE; gchar *savefile = NULL; GOptionContext *ctx;GError *err = NULL; GOptionEntry entries[] = { { "silent", 's', 0,G_OPTION_ARG_NONE, &silent, "do not output status information", NULL }, { "output", 'o', 0, G_OPTION_ARG_STRING, &savefile, "save xml representation of pipeline to FILE and exit", "FILE" }, { NULL } }; ctx = g_option_context_new ("- Your application");g_option_context_add_main_entries (ctx, entries, NULL);g_option_context_add_group (ctx, gst_init_get_option_group ()); if(!g_option_context_parse (ctx, &argc, &argv, &err)) { g_print ("Failed to initialize: %s\n", err->message); g_error_free (err);return 1; } printf ("Run me with --help to see the Application options appended.\n"); return 0; }如例子中的代码所示,你可以通过 GOption 表来定义你的命令行选项.将表与由gst_init_get_option_group函数返回的选项组一同传给GLib初始化函数. 通过使用GOption表来初始化GSreamer,你的程序还可以解析除标准GStreamer选项以外的命令行选项.第五章. 组件(Element)对程序员来说,GStreamer 中最重要的一个概念就是 GstElement 对象.组件是构建一个媒体管道的基本块.所有上层(high-level)部件都源自 GstElement物件.任何一个译码器编码器,分离器,视频/音频输出部件实际上都是一个 GstElement对象.5.1. 什么是组件?对程序员来说,组件就像一个黑盒子.你从组件的一端输入数据,组件对数据进行一些处理,然后数据从组件的另一段输出.拿一个译码组件来说,你输入一些有特定编码的数据, 组件会输出相应的译码数据. 在下一章 (Pads and capabilities), 你将学习到更多关于对组件进行数据输入输出的知识, 以及如何在你的程序中实现数据的输入输出.5.1.1.源组件源组件(Source elements)为管道产生数据, 比如从磁盘或者声卡读取数据.图 5-1 形象化的源组件.我们总是将源衬垫(source pad)画在组件的右端. 图 5-1.形象化的源组件源组件不接收数据,仅产生数据.你可从上图中明白这一点,因为上图仅有一个源衬垫(右端),同样的, 源衬垫也仅产生数据(对外部而言).5.1.2. 过滤器(filters),转换器(convertors),分流器 (demuxers),整流器(muxers)以及编译码器(codecs)过滤器(Filters)以及类过滤组件(Filter-like elements)都同时拥有输入和输出衬垫. 他们对从输入衬垫得到的数据进行操作,然后将数据提供给输出衬垫.音量组件 (filter),视频转换器 (convertor),Ogg 分流器或者 Vorbis 译码器都是这种类型的组件. 类过滤组件可以拥有任意个的源衬垫或者接收衬垫. 像一个视频分流器可能有一个接收衬垫以及多个(1-N)源衬垫,每个接收衬垫对应一种元数据流 (elementary stream).相反地,译码器只有一个源衬垫及一个接收衬垫. 图5-2. 形象化的过滤组件图 5-2 形象化了类过滤组件.这个特殊的组件同时拥有源端和接收端.接收输入数据的接收衬垫在组件的左端,源衬垫在右端. 图 5-3. 形象化的拥有多个输出的过滤组件图 5-3 显示了另一种了类过滤组件.它有多个输出衬垫(source pad).Ogg分流器是个很好的实例.因为Ogg流包含了视频和音频.一个源衬垫可能包含视频元数据流,另一个则包含音频元数据流.当一个新的衬垫被创建时,分流器通常会产生一个信号.程序员可以在信号处理事件中处理新的元数据流.5.1.3.接收组件接收组件是媒体管道的末端,它接收数据但不产生任何数据.写磁盘,利用声卡播放声音以及视频输出等都是由接收组件实现的.图 5-4 显示了接收组件. 图 5-4. 形象化的接收组件5.2. 创建一个GstElement物件创建一个组件的最简单的方法是通过函数gst_element_factory_make ().这个函数使用一个已存在的工厂对象名和一个新的组件名来创建组件.创建完之后, 你可以用新的组件名在箱柜(bin)中查询得到这个组件.这个名字同样可以用来调试程序的输出.你可以通过传递 NULL 来得到一个默认的具有唯一性的名字. 当你不再需要一个组件时,你需要使用 gst_object_unref ()来对它进行解引用. 这会将一个组件的引用数减少 1. 任何一个组件在创建时, 其引用记数为 1. 当其引用记数为 0 时,该组件会被销毁. 下面的例子[1] 显示了如果通过一个fakesrc工厂对象来创建一个名叫source的组件.程序会检查组件是否创建成功.检查完毕后,程序会销毁组件.#include <gst/gst.h> int main (int argc, char *argv[]) { GstElement*element;/* init GStreamer */ gst_init (&argc, &argv); /* create element */ element =gst_element_factory_make ("fakesrc", "source"); if (!element){ g_print ("Failed tocreate element of type 'fakesrc'\n"); return -1; } gst_object_unref (GST_OBJECT(element)); return 0; }gst_element_factory_make 是 2 个函数的速记. 一个GstElement 对象由工厂对象创建而来.为了创建一个组件,你需要使用一个唯一的工厂对象名字来访问一个 GstElementFactory 对象.gst_element_factory_find ()就是做了这样的事. 下面的代码段创建了一个工厂对象,这个工厂对象被用来创建一个fakesrc组件——伪装的数据源.函数 gst_element_factory_create()将会使用组件工厂并根据给定的名字来创建一个组件.#include <gst/gst.h> int main (int argc, char *argv[]) {GstElementFactory *factory; GstElement * element; /* init GStreamer */ gst_init (&argc, &argv); /* create element, method #2 */ factory = gst_element_factory_find ("fakesrc"); if (!factory) { g_print ("Failed to find factory of type 'fakesrc'\n"); return -1; } element =gst_element_factory_create (factory, "source"); if (!element) { g_print ("Failed to create element, even though its factory exists!\n"); return -1; } gst_object_unref (GST_OBJECT (element)); return 0; }5.3. 使用组件作为GObject 对象GstElement的属性大多通过标准的 GObject 对象实现的.使用 GObject 的方法可以对GstElement实行查询,设置,获取属性的值.同样 GParamSpecs 也被支持. 每个GstElement 都从其基类 GstObject 继承了至少一个"名字"属性.这个名字属性将在函数gst_element_factory_make ()或者函数 gst_element_factory_create () 中使用到.你可通过函数 gst_object_set_name 设置该属性,通过 gst_object_get_name 得到一个对象的名字属性.你也可以通过下面的方法来得到一个对象的名字属性. #include<gst/gst.h>int main (int argc, char *argv[]) { GstElement *element; gchar *name; /* init GStreamer */ gst_init (&argc, &argv); /* create element */ element = gst_element_factory_make ("fakesrc", "source"); /* get name */ g_object_get (G_OBJECT (element), "name", &name, NULL); g_print ("The name of the element is '%s'.\n", name); g_free (name); gst_object_unref (GST_OBJECT (element)); return 0; }大多数的插件(plugins)都提供了一些额外的方法,这些方法给程序员提供了更多的关于该组件的注册信息或配置信息.gst-inspect 是一个用来查询特定组件特性(properties)的实用工具.它也提供了诸如函数简短介绍,参数的类型及其支持的范围等信息.关于gst-inspect 更详细的信息请参考附录. 关于GObject特性更详细的信息,我们推荐你去阅读 GObject手册以及 Glib 对象系统介绍. GstElement对象同样提供了许多的 GObject 信号方法来实现一个灵活的回调机制.你同样可以使用 gst-inspect来检查一个特定组件所支持的信号.总之,信号和特性是组件与应用程序交互的最基本的方式.5.4. 深入了解组件工厂在前面的部分,我们简要介绍过 GstElementFactory 可以用来创建一个组件的实例,但是工厂组件不仅仅只能做这件事, 工厂组件作为在 GStreamer 注册系统中的一个基本类型, 它可以描述所有的插件(plugins)以及由GStreamer创建的组件. 这意味着工厂组件可以应用于一些自动组件实例,像自动插件(autopluggers); 或者创建一个可用组件列表,像管道对应用程序的类似操作(像GStreamer Editor) .5.4.1.通过组件工厂得到组件的信息像 gst-inspect 这样的工具可以给出一个组件的概要: 插件(plugin)的作者,描述性的组件名称(或者简称),组件的等级(rank)以及组件的类别(category).类别可以用来得到一个组件的类型,这个类型是在使用工厂组件创建该组件时做创建的.例如类别可以是Codec/Decoder/Video(视频译码器),Source/Video(视频发生器),Sink/Video(视频输出器).音频也有类似的类别.同样还存在 Codec/Demuxer 和 Codec/Muxer,甚至更多的类别.Gst-inspect 将会列出当前所有的工厂对象, gst-inspect <factory-name> 将会列出特定工厂对象的所有概要信息. #include <gst/gst.h> int main (int argc, char *argv[]) { GstElementFactory *factory; /* init GStreamer */gst_init (&argc, &argv); /* get factory */ factory =gst_element_factory_find ("audiotestsrc"); if (!factory){ g_print ("You don't have the 'audiotestsrc' element installed!\n"); return -1; } /* display information */ g_print ("The '%s' element is a member of the category %s.\n" "Description: %s\n",gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)), gst_element_factory_get_klass (factory),gst_element_factory_get_description (factory)); return 0; } 你可以通过 gst_registry_pool_feature_list (GST_TYPE_ELEMENT_FACTORY)得到所有在 GStreamer 中注册过的工厂组件.5.4.2. 找出组件所包含的衬垫工厂组件最有用处的功能可能是它包含了对组件所能产生的衬垫的一个详细描述,以及这些衬垫的功能(以行外话讲: 就是指这些衬垫所支持的媒体类型),而得到这些信息是不需要将所有的插件(plugins)都装载到内存中.这可用来给一个编码器提供一个编码列表,或在多媒体播放器自动加载插件时发挥作用.目前所有基于 GStreamer 的多媒体播放器以及自。
浪潮服务器安装手册
2
关于本手册
第一章 服务器概述 这一章向您详细介绍本服务器的技术特性、外观特性、I/O 接口技术规格等。
第二章 系统 BIOS 设置
第三章 第四章
这一章向您介绍本服务器的系统BIOS设置情况。 SATA RAID设置 这一章向您介绍了主板集成SATA RAID的设置方法。 系统硬件安装 这一章向您详细介绍本服务器的硬件安装与拆卸情况。
1、在改变服务器 BIOS 设置前,请记录下相应的初始设置,以便在因修改选项而出现系统 工作异常时,可以根据记录的初始设置重新恢复。
2、通常系统出厂默认设置都是最优化设置。在未理解各参数表示的意义前,不要试图进行 更改。
3、本章主要对常用设置作详细说明。使用过程中较少涉及的选项仅作简单说明或未作说明。 4、根据产品的不同配置,BIOS的内容会有所变化,在此不作详细说明。
第五章 安装操作系统
这一章向您详细介绍如何在本服务器上安装各种主流操作系统。
技术服务电话: 86-531-88546554
地址: 邮编:
中国济南市山大路 224 号 浪潮集团有限公司
250013
3
目录 声 明............................................... 2 关于本手册............................................. 3 第一章 服务器概述 ...................................... 5
硬盘 硬盘类型 硬盘数 外部存储驱动器 软驱(可选) 光驱 电源及功耗 功率 物理规格 高度 深度 宽度 重量
浪潮服务器安装手册
PCI、PCI-E 2个 PCI 32Bit/33MHz 5V 插槽 1个 PCI-E × 1 (使用PCI Express ×8 插槽) 1个 PCI-E × 8 (使用PCI Express ×8 插槽)
1.1 技术规格 ........................................ 5 1.2 前面板介绍 ...................................... 6 1.3 后面板介绍 ...................................... 8 第二章 系统 BIOS 设置 .................................. 10 2.1 如何进入 BIOS 设置 .............................. 10 2.2 BIOS 系统菜单介绍 .............................. 10 第三章 SATA RAID 设置 ................................. 14 第四章 系统硬件安装 ................................... 19 4.1 主板接口与插座介绍 ............................. 20 4.2 安装处理器和内存 ............................... 21 4.3 安装磁盘驱动器 ................................. 24 4.4 安装光驱 ....................................... 24 4.5 安装软驱 ....................................... 26 4.6 主板电池的更换 ................................. 26 第五章 安装操作系统 ................................. 27 5.1 安装 Windows Server 2003 ........................ 27 5.2 Red Hat Enterprise Linux AS4.0 update2 的安装 ... 29
安卓版GIStar及配套软件操作手册(32开)(待修改)
操作手册1.操作说明 (1)1.1.工程管理 (1)1.2.新建工程 (3)1.3.图层管理 (4)1.4.图层配置 (6)1.5.新建地物 (7)1.6.编辑地物 (10)1.7.查询地物 (12)1.8.屏幕量算 (13)1.9.轨迹记录 (13)1.10.放样 (14)1.11.地物管理 (15)1.12.地物查看和编辑 (17)1.13.采集条件设置 (18)1.14.坐标系统管理 (19)1.15.新建、修改坐标系统 (20)1.16.数据字典管理 (21)1.17.轨迹管理 (21)1.18.系统设置 (22)1.19.软件注册 (23)1.20.软件升级 (24)1.21.关于系统 (25)1.22.意见反馈 (26)2.配套软件说明 (27)3.附录:常见问题解答 (44)3.1.软件如何注册 (44)3.2.为何采集的地物类型单一 (44)3.3.图层导入与显示 (45)3.4.地物查看与编辑 (45)3.5.数据的导入与导出 (45)3.6.数据导出坐标的显示转换 (46)3.7.数据字典导入使用 (46)3.8.GIS TAR安装目录及介绍 (47)3.9.在照片中添加水印获取当前坐标 (47)3.10.其它 (49)1 / 521. 操作说明1.1. 工程管理功能描述用户通过查看工程列表,了解工程信息。
可以进行新建、打开和删除工程的操作操作方法工程管理:点击 “工程”按钮,进入工程管理界面(工程界面显示当前工程和工程列表)工程信息:点击当前工程“营销GIS ”=》查看当前工程信息(图1.1-1)打开工程:点击已有工程“北京丰台”=》打开现有工程(有工程内容预览)=》返回主界面删除工程:长按工程列表=》选择工程(图1.1-2)=》点击删除=》删除选中工程2 / 52图1.1-1 图1.1-2备注:选择操作用户可以,通过情景菜单全选和取消全选(软件其他所有列表操作相同,下不做描述)3 / 521.2. 新建工程功能描述用户根据自己的配置,新建一个工程开始基础数据采集工作 操作方法工程管理界面=》点击“新建”=》进入新建工程界面=》填写工程名称(必填)、采集人员=》选择一个数据模板(默认点线面)(图1.2-1)=》选择坐标系统(默认WGS84)图1.2-1备注:数据模版通过数据字典工具生成(使用方式请参照帮助文档) 坐标系统可以点击选择对话框中+自定义新建一个坐标系统(参考:“1.15新建坐标系统”)4 / 521.3. 图层管理功能描述查看当前工程的图层信息,设置背景图层,导入、移动和删除图层操作方法图层管理:点击图层=>图层管理界面选择底图:点击地图图层=》选择底图(底图支持*.GCP 等)=》点击控制图层的显示/隐藏导入图层:点击“导入”=》选择要使用的图层图层配置:点击图层列表中某一项=》进入图层配置(图1.3-1)删除图层:长按图层列表=>勾选图层(图1.3-2)=》点击删除图层5 / 52图1.3-1 图1.3-26 / 521.4. 图层配置功能描述配置图层的符号、显示标注字段,设置显示字段样式,设置图层显示比例尺操作方法符号选择:点击“符号”,选择一个符号样式标注:点击“标注开关”,开启或者关闭标注标注字段:点击标注字段,选择要标注的字段标注颜色:点击标注颜色,选择一个标注字段颜色标注字号:点击标注字段字号大小(小中大)7 / 52 1.5. 新建地物功能描述新建/采集一个新的地物,可以通过多种方式采集,填写用户自定义的表单信息操作方法点击新建地物=》选择图层(默认上次选择) =》选择采集方式(默认上次选择)屏幕采集:点击屏幕=》采集一个点即可采集:点击采集按钮=》采集一个点平滑采集:点击采集按钮=》采集一个点(平滑)8 / 52自动采集:点击采集按钮=》开始采集=>点击停止=》9 / 52采集一系列点填写属性:点击属性=》填写地物属性信息保存地物:点击保存=》确认属性信息=》保存地物备注:采集过程中可以撤销、恢复、清除当前采集的地物(下图)图1.5-1 图1.5-2 图1.5-3 采集过程中也可以编辑地物节点(参考下章节:“1.6编辑地物”)。
gstreamer手册(简体中文版)
组件(Elements)。对于如何编写组件(Elements)的话题在GStreamer Plugin Writer's Guide中有详细的说明。
3.2. 箱柜(Bins)和管道(pipelines)
箱柜(Bins)是一个可以装载组件(element)的容器。管道(pipelines)是箱柜 (Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所 有组件(element)。因为箱柜(Bins)本身又是组件(element)的子集,所以你能够 象操作普通组件(element)一样的操作一个箱柜(Bins), 通过这种方法可以降低 你的应用程序的复杂度。你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins) 内部所有组件(element)的状态。箱柜(Bins)可以发送总线消息(bus messages) 给它的子集组件(element)(这些消息包括:错误消息(error messages),卷标消 息(tag messages),EOS消息(EOS messages))。
2.1.3. 没有统一的插件管理机制
典型的播放器对于不同的媒体类型会有不同的插件,两个媒体播放器会实现各自 不同的插件机制,所以编译码器不能方便的交换。每一个典型的媒体播放器的插 管理件系统是具有其特定应用程序的需求。
缺少统一的插件机制,已经严重阻碍了二进制编译码器的发展,因为没有一家公 司希望将代码移植到不同的插件机制。
Gstreamer培训资料
——配置及使用 ——配置及使用研究发展部Gstreamer2010-6-245061167971• • • • • •Gstreamer 是什么 Gstreamer的组成结构 Gstreamer的组成结构 Gstreamer的通信机制 Gstreamer的通信机制 Gstreamer怎样配置安装 Gstreamer怎样配置安装 怎么使用Gstreamer 怎么使用Gstreamer 怎么编写Gstreamer 怎么编写Gstreamer插件 Gstreamer插件2010-6-245061167972Gstreamer 是什么Gstreamer : 是linux上的开源的(Multi-media Framework) 多媒体应用框架 实现语言: C语言 面向对象: GlibGlib浅析GObject对象系统Glib工具集基本设计思想: 来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了 DirectShow的设计思想, 使得在同一框架下编写任意类型的流媒体应用程序成为 了可能 。
在编写处理音频、视频或者两者皆有的应用程序时, 变得非常简单。
同 时GStreamer并不受限于音频和视频处理, 它能够处理任意类型的数据流。
最显著的用途:1. 2. 3. 4. 构建音视频播放器 编辑音视频文件 音视频格式转换 流媒体服务2010-6-245061167973Gstreamer 是什么版本发布历史: 0.0.1 – 10th 0.3.0 – 12th 0.4.0 – 5th 0.6.0 – 1st 0.8.0 – 16th 0.10.0 - 5th June 1999 Dec 2001 July 2002 Feb 2003 March 2004 Dec 2005最新版本: gstreamer-0.10.29 27-Apr-2010 当前使用: gstreamer-0.10.28 08-Mar-2010 下载地址:/src/ 网站: / /2010-6-245061167974Gstreamer的组成结构 Gstreamer的组成结构(整体构架) 整体构架)Gstreamer Tools gst-inspect gst-launch gst-editor Media Player Gstreamer Applications VoIP & Video Conference Streaming Server Video Editor (….)Gstreamer Core Framework多媒体应用接口 插件构架 管道构架 媒体类型协商机制 150多个插件 一些工具集3rd Part Plugins2010-6-245061167975Gstreamer的组成结构 Gstreamer的组成结构(文件系统) 文件系统)模块 gstreamer gst-plugins-base gst-plugins-good gst-plugins-ugly gst-plugins-bad gst-plugins-gl gst-ffmpeg gnonlin gst-python gstreamer-sharp gst-rtsp-server gst-plugins gst-editor gst-recorder gst-monkeysaudio2010-6-24描述 core library and elements an essential exemplary set of elementsstable version 0.10.29 0.10.29a set of good-quality plug-ins under our 0.10.23 preferred license, LGPL a set of good-quality plug-ins that might pose 0.10.15 distribution problems a set of plug-ins that need more quality plug-in and helper libraries for OpenGL integration FFmpeg-based plug-in Non-linear editing elements python bindings C#/.NET bindings RTSP server additional elements graphical pipeline editor audio/video recorder Monkey's Audio plug-in5061167970.10.19 0.10.1 0.10.10 0.10.15 0.10.18 0.9.2 0.10.5 0.8.12 0.8.0 N/A 0.8.06Gstreamer的组成结构 Gstreamer的组成结构(组成元素) 组成元素)Elements 具有一定功能的基本单元。
山石网科漏洞扫描系统V5.5-1.9.7版本说明说明书
Version V5.5-1.9.7山石网科漏洞扫描系统V5.5-1.9.7发布概述发布日期:2022年9月27日本次发布新增基线配置核查支持RDP协议和支持批量上传Windows离线检查结果,优化漏洞引擎,提升内网存活探测准确率及漏洞检测精度。
平台和系统文件新增功能功能描述新漏洞库信息总数192236条。
在线基线扫描支持RDP协议。
基线配置核查支持批量上传Windows离线检查结果。
增加基线配置核查离线脚本(apache、tomcat、weblogic、webshere、mysql、oracle、sqlserver)。
更新了Apache ActiveMQ、Google Golang、Iteris Apache Velocity、Mozilla Firefox、Sangoma Technologies Asterisk、Linux kernel、Pillow、AdPlug、Gnome gnome-autoar、KDE Discover、wpa_supplicant组件相关的漏洞库。
新增CVE-2019-0630 SMB2远程代码执行漏洞、CVE-2020-1350 域名服务器漏洞信息扫描。
修复了MySQL弱密码漏报。
更新了Adobe Acrobat Reader、 Apache Ambari、 Struts2、Mozilla Firefox、Linux kernel、Dovecot、aiohttp、OpenSSL、OpenLDAP、Oracle Database Server、TYPO3 Core、Python、Oracle Fusion Middleware组件相关的漏洞库。
更新了artifex mupdf、 Linux kernel、 pki-core 、Samba、Caucho Technology Resin、Red Hat Directory Server、Wireshark、Cloud Native Computing CNI、Openvswitch、Google Chrome、GNOME Keyring、GNU Binutils组件相关的漏洞库。
ubuntu使用手册
totem-pps:
/~jinghua/totem-pps/
另外还有个不负责任的 xine-pps:
/~jinghua/xine-pps/
下载后,解压、编译、安装。如果不懂得使用源代码编译安装的,可以使用(portis21提供的)PPA源安装,方法很简单:
* 支持系统:Ubuntu 8.04
* 运行环境:Console环境下运行,需要系统安装Framebuffer驱动
* 权限要求:root用户,本程序安装需要root权限,以保证程序的正常安装。
* 使用方法:
* 1:解压release_for_ubuntu.tgz到任意目录;tar xzf release_for_ubuntu.tgz;
Totem Movie Player是一套在类Unix操作系统上运行的多媒体播放器,其建基于GNOME桌面环境。(其默认的多媒体引擎是GStreamer,但亦可使用Xine程式库。)
ppstream简称PPS,PPS是集P2P直播点播于一身的网络电视软件。
安装:
首先安装Totem软件,GNOME桌面环境的ubuntug默认就安装了Totem(应用程序-影音-电影播放机)。
修补程序在这里下载:
http://ftp.cvut.cz/vmware/vmware-any-any-update109.tar.gz
[/url]
linux下C/C++ IDE Anjuta安装
1、准备工作
如果你还没装编译环境或自己不确定装没装,不妨先执行:
sudo apt-get install build-essential
2、Anjuta 介绍
Anjuta DevStudio 官方地址:/
gst-play 用法
gst-play 用法gst-play 是 GStreamer 中的一个重要组件,它用于播放音频和视频流。
GStreamer 是一个流媒体处理框架,可用于处理音频、视频和其他类型的媒体数据。
在本文档中,我们将介绍 gst-play 的基本用法、安装和配置、常用插件、使用示例以及常见问题。
一、基本用法gst-play 为用户提供了播放音频和视频流的功能。
要使用 gst-play,您需要先确保已正确安装 GStreamer 及其相关组件。
您可以通过以下步骤来安装和配置 gst-play:1. 安装 GStreamer:根据您的操作系统,下载并安装适用于您的GStreamer 版本。
2. 配置环境变量:将 GStreamer 的 bin 目录添加到您的 PATH 环境变量中,以便在命令行中可以访问 gst-play。
3. 测试 gst-play:在命令行中输入 `gst-play` 并按回车键,这将启动 gst-play 应用程序并显示一些菜单选项。
使用 gst-play 时,您可以使用菜单选项来选择要播放的媒体文件或流媒体地址。
例如,您可以使用 `m` 选项来选择媒体文件,使用`v` 选项来选择视频流,使用 `h` 选项来显示帮助菜单。
您还可以使用其他选项来控制播放器的音量、暂停和停止等操作。
二、安装和配置要安装和配置 gst-play,请按照以下步骤操作:1. 确保已安装 GStreamer:根据您的操作系统,下载并安装适用于您的 GStreamer 版本。
2. 安装相关插件:GStreamer 需要一些插件来支持不同的媒体格式和流媒体协议。
您需要安装适用于您的 GStreamer 版本的相关插件。
3. 设置环境变量:将 GStreamer 的 bin 目录添加到您的 PATH 环境变量中,以便在命令行中可以访问 gst-play 和其他相关的工具和库。
4. 测试 gst-play:在命令行中输入 `gst-play` 并按回车键,检查是否能够正常启动 gst-play 并显示菜单选项。
Gstreamer工作原理分析
Gstreamer工作原理分析目录一、内容简述 (2)二、Gstreamer架构概述 (3)2.1 Gstreamer的模块组成 (5)2.2 Gstreamer的数据流处理 (6)2.3 Gstreamer的插件系统 (8)三、Gstreamer核心组件分析 (10)四、Gstreamer插件机制分析 (11)4.1 插件的概念和作用 (13)4.2 插件的分类 (14)4.3 插件的加载和卸载 (17)4.4 插件的依赖管理 (18)五、Gstreamer数据传输和处理机制分析 (19)5.1 Gstreamer的数据源 (21)5.2 Gstreamer的数据接收 (23)5.3 Gstreamer的数据处理 (25)5.4 Gstreamer的数据输出 (26)六、Gstreamer的布局和排布机制分析 (28)6.1 Gstreamer的布局概念 (29)6.2 Gstreamer的布局类型 (31)6.3 Gstreamer的排布策略 (32)6.4 Gstreamer的布局和排布优化 (33)七、Gstreamer的调试和测试方法分析 (35)7.1 Gstreamer的调试工具 (36)7.2 Gstreamer的测试方法 (38)7.3 Gstreamer的性能优化 (39)八、总结与展望 (41)8.1 Gstreamer的工作原理总结 (42)8.2 Gstreamer的发展趋势和前景 (43)一、内容简述Gstreamer是一个强大的多媒体处理框架,广泛应用于音视频流的捕获、转换、处理和播放。
其工作原理主要围绕数据流的处理和分析展开,涉及媒体数据的采集、处理、传输和呈现等多个环节。
本文主要分析Gstreamer的工作原理,包括其核心组件和功能模块的作用与交互方式。
Gstreamer通过插件系统实现各种媒体处理功能,包括音频和视频编解码、数据转换、流分析等等。
这些插件以pipeline的方式组合在一起,形成一条完整的媒体处理流水线。
G-STORMGS1Thermocycler中文操作手册
G-STORM GS1 Thermocycler中文操作手冊螢幕開機後顯示八個圓球, 分別代表八大功能, 可以觸碰螢幕或使用滑鼠將游標移到指令上即可操作該項功能, 八大功能如下1. New Program進入此畫面後, 右邊會出現所有設定的程式<Open Lid>打開上蓋, 並設定上蓋溫度<Close Lid>關閉上蓋<Automatic Hot Start>可設定指定溫度, 當溫度到達時自動進行後續反應<Manual Hot Start>可設定指定溫度, 當溫度到達時維持該溫度, 此時可開蓋進行其他步驟, 再以手動選擇進行後續反應<Start Cycle>設定cycle名稱, 次數<Temperature Step>設定溫度, 時間, 並可調整反應速率, 在每次cycle中調整溫度與時間<End Cycle>結束cycle<Gradient Step>可設定梯度溫度30-80℃, 在反應槽中等比分為12列, 依照圖形下方溫度可進行梯度PCR, 找出最適當溫度後, 在下方converse選項選定, 即可將此程式改為該最適當溫度<Touchdown>降低非特異性條帶產生頻率, 點此步驟無須外加其他步驟, 點入後選擇denature溫度, 最大和最小annealing溫度和elongation 溫度<Store>選擇PCR完成後儲存的溫度<Barcode Input>條碼機輸入功能2. Edit Program進入此畫面後, 會出現所有程式的文字檔, 依照不同使用者的檔案夾分類選定檔案後, 可進行開啟, 執行, 重新命名, 刪除..等步驟3. Run Program進入選單選擇欲執行的程式, 按下run selected, 在跳出的視窗中輸入反應體積即可進行反應4. Report進入此畫面後可依照月份, 使用者追朔曾經進行過的所有反應結果, 反應在每次結束後自動儲存成GLP與Labbook檔, Labbook檔點入可輸入此次反應結果, GLP檔點入後可觀察此次實驗所有資訊5. Program Wizard這個功能可以幫助使用者找尋未知的實驗條件, 依著機器設定的問題輸入條件, 即可由機器軟體推算出最適當的實驗條件1.輸入引子(primer)序列或引子之Tm值2.輸入預估產物全長3.輸入DNA來源, 如:細菌, 真核生物, 質體4.輸入其他特殊條件, 如:Hot start Taq, AT- or GC-rich所有條件輸入完畢後, 軟體即計算出最適當條件6. Settings進入畫面後會出現三個選項<Cycler Management>敘述機器並做機器OQ測試<User Management>將使用者權限區分為三種, Administrator, Register User, Guest User,Administrator具有最高權限, 其初始密碼為Admin, 可自行修改, Administrator可增加新的User, 給予編輯檔案, 修改檔案, 刪除檔案等權限, Guest User 為權限最低使用者<Cycler Setting>設定日期, 時間和語言7. Open/Close Lid打開/關閉上蓋8. Incubate選擇所需的溫度與時間, 即可進行單一溫度控溫。
G-System中文用户手册
调音器 回放模式下的调音器 . . . . .. . . . . . . . . . . . . . .49 调音器模式参数 . . . . . . . . . . . . . . . . . . . . . . . . .50
按键计速 按键计速 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
次级参数让每个效果的设置都适应这个拍速11向下进入返回键downenterreturn踩下它就会从一个音色库跳到前面的音色库例如从音色库3跳到音色库212向上菜单模式键upmenumode用这个切换开关键从一个音色库跳到下一个音色库例如从音色库2跳到音色库3按下将进入编辑模式在编辑模式这个编码器用来调节预设输出电平
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gstreamer手册(简体中文版)本文由muzhonger贡献pdf文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
第 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)的函数接口它们是用于能够读取文件的数据,译码文件数据的. 而有些组件(Elements)的函数接口只是输出相应的数据到具体的设备上(例如, 声卡设备).你可以将若干个组件(Elements)连接在一起,从而创建一个管道 (pipeline)来完成一个特殊的任务,例如,媒体播放或者录音.GStreamer已经默认安装了很多有用的组件(Elements),通过使用这些组件(Elements)你能够构建一个具有多种功能的应用程序. 当然,如果你需要的话,你可以自己编写一个新的组件(Elements).对于如何编写组件(Elements)的话题在 GStreamer Plugin Writer'sGuide中有详细的说明.3.2. 箱柜(Bins)和管道(pipelines)箱柜(Bins) 是一个可以装载组件(element)的容器.管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有组件(element).因为箱柜(Bins)本身又是组件(element)的子集,所以你能够象操作普通组件(element)一样的操作一个箱柜(Bins), 通过这种方法可以降低你的应用程序的复杂度.你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins) 内部所有组件(element)的状态.箱柜(Bins)可以发送总线消息(bus messages) 给它的子集组件(element)(这些消息包括:错误消息(error messages),卷标消息(tag messages),EOS消息(EOS messages)). 管道(pipeline)是高级的箱柜(Bins). 当你设定管道的暂停或者播放状态的时候, 数据流将开始流动,并且媒体数据处理也开始处理. 一旦开始,管道将在一个单独的线程中运行,直到被停止或者数据流播放完毕.3.3. 衬垫(Pads)衬垫(Pads)在GStreamer中被用于多个组件的链接,从而让数据流能在这样的链接中流动. 一个衬垫(Pads)可以被看作是一个组件(element)插座或者端口,组件 (element)之间的链接就是依靠着衬垫(Pads).衬垫(Pads)有处理特殊数据的能力:一个衬垫(Pads)能够限制数据流类型的通过.链接成功的条件是:只有在两个衬垫(Pads)允许通过的数据类型一致的时候才被建立. 数据类型的设定使用了一个叫做caps negotiation的方法.数据类型被为一个GstCaps变数所描述. 下面的这个比喻可能对你理解衬垫(Pads)有所帮助. 一个衬垫(Pads)很象一个物理设备上的插头.例如一个家庭影院系统.一个家庭影院系统由一个放大器 (amplifier),一个DVD机,还有一个无声的视频投影组成.我们需要连接DVD机到功放(amplifier),因为两个设备都有音频插口;我们还需要连接投影机到DVD机上,因为两个设备都有视频处理插口.但我们很难将投影机与功放(amplifier) 连接起来,因为他们之间处理的是不同的插口. GStreamer衬垫(Pads)的作用跟家庭影院系统中的插口是一样的. 对于大部分情况,所有的数据流都是在链接好的元素之间流动.数据向组件(element)以外流出可以通过一个或者多个 source 衬垫(Pads),组件(element) 接受数据是通过一个或者多个sink 衬垫(Pads)来完成的. Source组件(element) 和sink组件(element)分别有且仅有一个 sink 衬垫(Pads)或者source 衬垫(Pads).数据在这里代表的是缓冲区(buffers) (GstBuffer对象描述了数据的缓冲区 (buffers) 的信息 ) 和事件 (events) (GstEvent 对象描述了数据的事件 (events)信息).1.4. 本手册结构为了帮助你更好的学习本手册, 我们将本手册分为几个大的部分, 每一部分阐述了一个在GStreamer应用程序开发过程中特殊而又有用的话题.如下所示: Part I --- GStreamer应用程序开发手册 (0.10.9.1)给你一个关于GStreamer 总的概况叙述. Part II --- GStreamer 应用程序开发手册 (0.10.9.1)阐述GStreamer应用程序开发的基本概念.本章结束后, 你将可以使用GStreamer来开发你自己的音频播放器. Part III --- GStreamer 应用程序开发手册 (0.10.9.1)我们将继续讨论一些有关GStreamer深层次的主题, 这些主题告诉了我们为什么GStreamer能在众多的竞争者当中脱颖而出. 我们将使用动态参数和动态接口来讨论应用程序中管道的交讯问题, 我们还将讨论线程同步,时钟同步,以及其它同步问题.这些问题的讨论不仅向你讲述如何使用GStreamer的API, 而且还将告诉你一些基于 GStreamer应用程序开发过程中所经常遇到的问题的解决办法, 通过这些知识的学习使你更加深刻的理解GStreamer的基本概念. Part IV --- GStreamer 应用程序开发手册(0.10.9.1)我们将进入GStreamer 的高级编程领域.你不需要对GStreamer所有的细节都了解清楚,但是基本的 GStreamer概念仍然是需要的. 我们将讨论XML, playbin, autopluggers等话题. Part V --- GStreamer 应用程序开发手册 (0.10.9.1)你将学习到一些有关 GStreamer与GNOME,KDE,OS,X或者Windows集成的知识, 当然你还将学习到一些有关调试和如何处理常见问题的方法. 通过这些知识的学习, 将更好的方便你使用GStreamer第 4 章. 初始化GStreamer当你准备写一个 GStreamer 应用程序时,你仅需要通过包含头档 gst/gst.h来访问库函数.除此之外,不要忘记初始化 GStreamer 库.4.1. 简易初始化在 GStreamer 库被使用前,主应用程序中应该先调用函数 gst_init,这个函数将会对GStreamer 库做一些必要的初始化工作,同时也能够对 GStreamer 的命令行参数进行解析.一个典型的初始化GStreamer库的代码 [1] 如下所示: 例 4-1. 初始化GStreamer#include <gst/gst.h> int main (int argc, char *argv[]) { const gchar *nano_str; guint major, minor, micro, nano; gst_init (&argc, &argv); gst_version (&major, &minor, µ, &nano); if (nano == 1) nano_str = "(CVS)"; else if (nano == 2) nano_str = "(Prerelease)"; else nano_str = ""; printf ("This program is linked against GStreamer %d.%d.%d %s\n", major, minor, micro, nano_str); return 0; }你可以使用 GST_VERSION_MAJOR, GST_VERSION_MINOR 以及GST_VERSION_MICRO 三个宏得到你的 GStreamer 版本信息,或者使用函数 gst_version 得到当前你所调用的链接库的版本信息.目前 GStreamer 使用了一种保证主要版本和次要版本中 API-/以及 ABI 兼容的策略. 当命令行参数不需要被 GStreamer 解析的时候, 你可以在调用函数gst_init 时使用 2 个 NULL 参数.4.2. 使用 GOption 接口来初始化你同样可以使用 GOption 表来初始化你的参数.例子如下: 例 4-2. 使用GOption 接口来初始化 #include <gst/gst.h> int main (int argc, char *argv[]) { gboolean silent = FALSE; gchar *savefile = NULL; GOptionContext *ctx;GError *err = NULL; GOptionEntry entries[] = { { "silent", 's', 0,G_OPTION_ARG_NONE, &silent, "do not output status information", NULL }, { "output", 'o', 0, G_OPTION_ARG_STRING, &savefile, "save xml representation of pipeline to FILE and exit", "FILE" }, { NULL } }; ctx = g_option_context_new ("- Your application");g_option_context_add_main_entries (ctx, entries, NULL);g_option_context_add_group (ctx, gst_init_get_option_group ()); if(!g_option_context_parse (ctx, &argc, &argv, &err)) { g_print ("Failed to initialize: %s\n", err->message); g_error_free (err);return 1; } printf ("Run me with --help to see the Application options appended.\n"); return 0; }如例子中的代码所示,你可以通过 GOption 表来定义你的命令行选项.将表与由gst_init_get_option_group函数返回的选项组一同传给GLib初始化函数. 通过使用GOption表来初始化GSreamer,你的程序还可以解析除标准GStreamer选项以外的命令行选项.第五章. 组件(Element)对程序员来说,GStreamer 中最重要的一个概念就是 GstElement 对象.组件是构建一个媒体管道的基本块.所有上层(high-level)部件都源自 GstElement物件.任何一个译码器编码器,分离器,视频/音频输出部件实际上都是一个 GstElement对象.5.1. 什么是组件?对程序员来说,组件就像一个黑盒子.你从组件的一端输入数据,组件对数据进行一些处理,然后数据从组件的另一段输出.拿一个译码组件来说,你输入一些有特定编码的数据, 组件会输出相应的译码数据. 在下一章 (Pads and capabilities), 你将学习到更多关于对组件进行数据输入输出的知识, 以及如何在你的程序中实现数据的输入输出.5.1.1.源组件源组件(Source elements)为管道产生数据, 比如从磁盘或者声卡读取数据.图 5-1 形象化的源组件.我们总是将源衬垫(source pad)画在组件的右端. 图 5-1.形象化的源组件源组件不接收数据,仅产生数据.你可从上图中明白这一点,因为上图仅有一个源衬垫(右端),同样的, 源衬垫也仅产生数据(对外部而言).5.1.2. 过滤器(filters),转换器(convertors),分流器 (demuxers),整流器(muxers)以及编译码器(codecs)过滤器(Filters)以及类过滤组件(Filter-like elements)都同时拥有输入和输出衬垫. 他们对从输入衬垫得到的数据进行操作,然后将数据提供给输出衬垫.音量组件 (filter),视频转换器 (convertor),Ogg 分流器或者 Vorbis 译码器都是这种类型的组件. 类过滤组件可以拥有任意个的源衬垫或者接收衬垫. 像一个视频分流器可能有一个接收衬垫以及多个(1-N)源衬垫,每个接收衬垫对应一种元数据流 (elementary stream).相反地,译码器只有一个源衬垫及一个接收衬垫. 图5-2. 形象化的过滤组件图 5-2 形象化了类过滤组件.这个特殊的组件同时拥有源端和接收端.接收输入数据的接收衬垫在组件的左端,源衬垫在右端. 图 5-3. 形象化的拥有多个输出的过滤组件图 5-3 显示了另一种了类过滤组件.它有多个输出衬垫(source pad).Ogg分流器是个很好的实例.因为Ogg流包含了视频和音频.一个源衬垫可能包含视频元数据流,另一个则包含音频元数据流.当一个新的衬垫被创建时,分流器通常会产生一个信号.程序员可以在信号处理事件中处理新的元数据流.5.1.3.接收组件接收组件是媒体管道的末端,它接收数据但不产生任何数据.写磁盘,利用声卡播放声音以及视频输出等都是由接收组件实现的.图 5-4 显示了接收组件. 图 5-4. 形象化的接收组件5.2. 创建一个GstElement物件创建一个组件的最简单的方法是通过函数gst_element_factory_make ().这个函数使用一个已存在的工厂对象名和一个新的组件名来创建组件.创建完之后, 你可以用新的组件名在箱柜(bin)中查询得到这个组件.这个名字同样可以用来调试程序的输出.你可以通过传递 NULL 来得到一个默认的具有唯一性的名字. 当你不再需要一个组件时,你需要使用 gst_object_unref ()来对它进行解引用. 这会将一个组件的引用数减少 1. 任何一个组件在创建时, 其引用记数为 1. 当其引用记数为 0 时,该组件会被销毁. 下面的例子[1] 显示了如果通过一个fakesrc工厂对象来创建一个名叫source的组件.程序会检查组件是否创建成功.检查完毕后,程序会销毁组件.#include <gst/gst.h> int main (int argc, char *argv[]) { GstElement*element;/* init GStreamer */ gst_init (&argc, &argv); /* create element */ element =gst_element_factory_make ("fakesrc", "source"); if (!element){ g_print ("Failed tocreate element of type 'fakesrc'\n"); return -1; } gst_object_unref (GST_OBJECT(element)); return 0; }gst_element_factory_make 是 2 个函数的速记. 一个GstElement 对象由工厂对象创建而来.为了创建一个组件,你需要使用一个唯一的工厂对象名字来访问一个 GstElementFactory 对象.gst_element_factory_find ()就是做了这样的事. 下面的代码段创建了一个工厂对象,这个工厂对象被用来创建一个fakesrc组件——伪装的数据源.函数 gst_element_factory_create()将会使用组件工厂并根据给定的名字来创建一个组件.#include <gst/gst.h> int main (int argc, char *argv[]) {GstElementFactory *factory; GstElement * element; /* init GStreamer */ gst_init (&argc, &argv); /* create element, method #2 */ factory = gst_element_factory_find ("fakesrc"); if (!factory) { g_print ("Failed to find factory of type 'fakesrc'\n"); return -1; } element =gst_element_factory_create (factory, "source"); if (!element) { g_print ("Failed to create element, even though its factory exists!\n"); return -1; } gst_object_unref (GST_OBJECT (element)); return 0; }5.3. 使用组件作为GObject 对象GstElement的属性大多通过标准的 GObject 对象实现的.使用 GObject 的方法可以对GstElement实行查询,设置,获取属性的值.同样 GParamSpecs 也被支持. 每个GstElement 都从其基类 GstObject 继承了至少一个"名字"属性.这个名字属性将在函数gst_element_factory_make ()或者函数 gst_element_factory_create () 中使用到.你可通过函数 gst_object_set_name 设置该属性,通过 gst_object_get_name 得到一个对象的名字属性.你也可以通过下面的方法来得到一个对象的名字属性. #include<gst/gst.h>int main (int argc, char *argv[]) { GstElement *element; gchar *name; /* init GStreamer */ gst_init (&argc, &argv); /* create element */ element = gst_element_factory_make ("fakesrc", "source"); /* get name */ g_object_get (G_OBJECT (element), "name", &name, NULL); g_print ("The name of the element is '%s'.\n", name); g_free (name); gst_object_unref (GST_OBJECT (element)); return 0; }大多数的插件(plugins)都提供了一些额外的方法,这些方法给程序员提供了更多的关于该组件的注册信息或配置信息.gst-inspect 是一个用来查询特定组件特性(properties)的实用工具.它也提供了诸如函数简短介绍,参数的类型及其支持的范围等信息.关于gst-inspect 更详细的信息请参考附录. 关于GObject特性更详细的信息,我们推荐你去阅读 GObject手册以及 Glib 对象系统介绍. GstElement对象同样提供了许多的 GObject 信号方法来实现一个灵活的回调机制.你同样可以使用 gst-inspect来检查一个特定组件所支持的信号.总之,信号和特性是组件与应用程序交互的最基本的方式.5.4. 深入了解组件工厂在前面的部分,我们简要介绍过 GstElementFactory 可以用来创建一个组件的实例,但是工厂组件不仅仅只能做这件事, 工厂组件作为在 GStreamer 注册系统中的一个基本类型, 它可以描述所有的插件(plugins)以及由GStreamer创建的组件. 这意味着工厂组件可以应用于一些自动组件实例,像自动插件(autopluggers); 或者创建一个可用组件列表,像管道对应用程序的类似操作(像GStreamer Editor) .5.4.1.通过组件工厂得到组件的信息像 gst-inspect 这样的工具可以给出一个组件的概要: 插件(plugin)的作者,描述性的组件名称(或者简称),组件的等级(rank)以及组件的类别(category).类别可以用来得到一个组件的类型,这个类型是在使用工厂组件创建该组件时做创建的.例如类别可以是Codec/Decoder/Video(视频译码器),Source/Video(视频发生器),Sink/Video(视频输出器).音频也有类似的类别.同样还存在 Codec/Demuxer 和 Codec/Muxer,甚至更多的类别.Gst-inspect 将会列出当前所有的工厂对象, gst-inspect <factory-name> 将会列出特定工厂对象的所有概要信息. #include <gst/gst.h> int main (int argc, char *argv[]) { GstElementFactory *factory; /* init GStreamer */gst_init (&argc, &argv); /* get factory */ factory =gst_element_factory_find ("audiotestsrc"); if (!factory){ g_print ("You don't have the 'audiotestsrc' element installed!\n"); return -1; } /* display information */ g_print ("The '%s' element is a member of the category %s.\n" "Description: %s\n",gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)), gst_element_factory_get_klass (factory),gst_element_factory_get_description (factory)); return 0; } 你可以通过 gst_registry_pool_feature_list (GST_TYPE_ELEMENT_FACTORY)得到所有在 GStreamer 中注册过的工厂组件.5.4.2. 找出组件所包含的衬垫工厂组件最有用处的功能可能是它包含了对组件所能产生的衬垫的一个详细描述,以及这些衬垫的功能(以行外话讲: 就是指这些衬垫所支持的媒体类型),而得到这些信息是不需要将所有的插件(plugins)都装载到内存中.这可用来给一个编码器提供一个编码列表,或在多媒体播放器自动加载插件时发挥作用.目前所有基于 GStreamer 的多媒体播放器以及自。