搜档网
当前位置:搜档网 › gstreamer手册(简体中文版)

gstreamer手册(简体中文版)

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的应用程序。对于想学习"如何编写插件"的朋友们, 我们建议你去参考<<插件编写指南(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/tcp

2.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'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))。

管道(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

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

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

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 to create 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

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

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 将会列出特定工厂对象的所有概要信息。

#include

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 的多媒体播放器以及自动加载器(autoplugger)都是以上述方式工作。当我们在下一章:衬垫与功能(Pads and capabilities)中学习到GstPad 与GstCaps 时,会对上面的特性有个更清晰的了解。

5.5. 链接组件

通过将一个源组件,零个或多个类过滤组件,和一个接收组件链接在一起,你可以建立起一条媒体管道。数据将在这些组件间流过。这是GStreamer 中处理媒体的基本概念。图5-5 用3个链接的组件形象化了媒体管道。

图5-5.形象化3个链接的组件

通过链接这三个组件,我们创建了一条简单的组件链。组件链中源组件("element1")的输出将会是类过滤组件("element2")的输入。类过滤组件将会对数据进行某些操作,然后将数据输出给最终的接收组件("element3")。

把上述过程想象成一个简单的 Ogg/V orbis 音频译码器。源组件从磁盘读取文件。第二个组件就是Ogg/V orbis 音频译码器。最终的接收组件是你的声卡,它用来播放经过译码的音频数据。我们将在该手册的后部分用一个简单的图来构建这个Ogg/V orbis 播放器。

上述的过程用代码表示为:

#include

int

main (int argc,

char *argv[])

{

GstElement *pipeline;

GstElement *source, *filter, *sink;

/* init */

gst_init (&argc, &argv);

/* create pipeline */

pipeline = gst_pipeline_new ("my-pipeline");

/* create elements */

source = gst_element_factory_make ("fakesrc", "source");

filter = gst_element_factory_make ("identity", "filter");

sink = gst_element_factory_make ("fakesink", "sink");

/* must add elements to pipeline before linking them */

gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);

/* link */

if (!gst_element_link_many (source, filter, sink, NULL)) {

g_warning ("Failed to link elements!");

}

[..]

}

对于一些特定的链接行为,可以通过函数gst_element_link () 以及

gst_element_link_pads()来实现。你可以使用不同的gst_pad_link_* ()函数来得到单个衬垫的引用并将它们链接起来。更详细的信息请参考API手册。

注意:在链接不同的组件之前,你需要确保这些组件都被加在同一个箱柜中,因为将一个组件加载到一个箱柜中会破坏该组件已存在的一些链接关系。同时,你不能直接链接不在同一箱柜或管道中的组件。如果你想要连接处于不同层次中的组件或衬垫,你将使用到精灵衬垫(关于精灵衬垫更多的信息将在后续章节中讲到) 。

5.6. 组件状态

一个组件在被创建后,它不会执行任何操作。所以你需要改变组件的状态,使得它能够做某些事情。Gstreamer中,组件有四种状态,每种状态都有其特定的意义。这四种状态为:

?GST_STATE_NULL: 默认状态。该状态将会回收所有被该组件占用的资源。

?GST_STATE_READY: 准备状态。组件会得到所有所需的全局资源,这些全局资源将被通过该组件的数据流所使用。例如打开设备、分配缓存等。但在这种状态下,数据流仍未开始被处理,所以数据流的位置信息应该自动置0。如果数据流先前被打开过,它应该被关闭,并且其位置信息、特性信息应该被重新置为初始状态。

?GST_STATE_PAUSED: 在这种状态下,组件已经对流开始了处理,但此刻暂停了处理。因此该状态下组件可以修改流的位置信息,读取或者处理流数据,以及一旦状态变为PLAYING,流可以重放数据流。这种情况下,时钟是禁止运行的。总之,PAUSED 状态除了不能运行时钟外,其它与

PLAYING 状态一模一样。

处于PAUSED 状态的组件会很快变换到PLAYING 状态。举例来说,视频或音频输出组件会等待数据的到来,并将它们压入队列。一旦状态改变,组件就会处理接收到的数据。同样,视频接收组件能够播放数据的第一帧。

(因为这并不会影响时钟)。自动加载器(Autopluggers)可以对已经加载进管道的插件进行这种状态转换。其它更多的像codecs或者filters这种组件不需要在这个状态上做任何事情。

?GST_STATE_PLAYING: PLAYING 状态除了当前运行时钟外,其它与PAUSED 状态一模一样。

基于GStreamer 的一些软件

1.GStreamer是什么? GStreamer是一个开源的多媒体框架库。利用它,可以构建一系列的媒体处理模块,包括从简单的ogg播放功能到复杂的音频(混音)和视频(非线性编辑)的处理。 应用程序可以透明的利用解码和过滤技术。开发者可以使用简洁通用的接口来编写一个简单的插件来添加新的解码器或滤镜。 2.基于GStreamer 的一些软件 所有软件按名称字母先后排列 acast acast 是为个人声音设备和各种流服务器提供音频网络广播的软件,它有GTK+2 和控制台界面。 amaroK amaroK 是KDE的一个播放器。 avisynth 3.0 Avisynth 3.0 是一个强大的视频帧服务器软件(video frameserver)。Banshee Banshee 是一个基于Mono 的 GNOME 的一个音乐播放器。 BMPx BMPx 是一个基于 GTK+ 的音乐播放器,它有类似'Winamp'的界面。Buzztard Buzztard 是一个类似Buzz和 FastTracker 的音乐软件。 Cupid 一个基于GStreamer的录像软件, 当前正在开发中,它将能高效的同步记录音频、视频,保存在GStreamer 支持的任一格式。 关于 Dave/Dina 工程 Dave/Dina 工程是一个关于播放和记录电视、多媒体等的机顶盒软件系统。 Elisa Einterface.lisa 是一个基于OpenGL的跨平台的媒体中心解决方案。

Eina Eina 是一个传统的音频播放软件,它有一个基于 GTK2 的界面。Flumotion Flumotion 是一个分布式流媒体服务器软件。 FUPlayer FUPlayer 是用Python 语言写的GNOME媒体播放器。 Gamp Gamp 是一个基于GNOME的媒体播放器。 Geekcast Geekast 是一个用Ruby写的基于GNOME 的P2P 流媒体客户端软件。GNOME Media GNOME Media 用GStreamer 来进行声音控制、音频录制和CD播放。GMediaRender GMediaRender 作为upnp媒体服务器的客户端。 Goobox Goobox 是一个基于GNOME 的cd 播放软件和剪辑(ripper)软件。GStreamer Editor GStreamer Editor 是拥有图形界面的管道构建编辑器。 Istanbul Istanbul 是一个屏幕记录器。 Jamboree Jamboree 是Imendio开发的基于GNOME的音乐播放器。 Jokosher Jokosher 是一个多媒体音乐编辑器。 JuK JuK 是KDE桌面的一个音乐自动点唱器。 Kaffeine

基于GStreamer的MP3播放器开发

电脑编程技巧与维护 1GStreamer GStreamer 是一个功能大的开源的多媒体框架,它对底层 的多媒体编解码器和硬件设备驱动进行了抽象和封装,提供了简单灵活的API ,降低了上层应用程序开发的难度,并且使得应用程序更易于维护。GStreamer 框架的功能涵盖了音频的输入输出以及视频的输入输出,因此基于GStreamer 可以开发各种各样的多媒体应用程序,包括音乐、视频播放器、录音机程序,以及移动设备中的照相机软件等。 GStreamer 的一大显著特点就是其基于插件的模块化设计,如图1所示。GStreamer 的系统架构可以分为两部分:核心模块core 和插件部分。GStreamer 把多媒体数据的输入、编解码处理以及输出都以插件模块集成到系统中。插件以共享库的形式存在,在运行期间由GStreamer 动态加载,并被链接成一个管道。Core 模块则为插件提供了一个集成框架,插件模块之间数据流的处理以及媒体类型的协商。 2编程基础 2.1组件 组件是GStreamer 中的一个重要对象,是GStreamer 插件在运行时的实例化。应用程序运行时,GStreamer 会根据媒体格式以及设备环境动态加载相应的插件,被实例化的组件对象就会有序地链接到一个管道pipeline 中。根据插件功能的类型,其组件可以分为:(1)输入型组件source element ,这种组件会向管道提供媒体数据,比如文件访问组件、声音获取组件等;(2)过滤型组件filter element ,它把从输入型组件中获取的媒体数据进行处理,比如进行格式转换、解复用de -muxer 、复用muxer 、编解码codec 等;(3)输出型组件sink element ,这类组件负责媒体数据的最后的输出,比如输出到音频设备、视频设备,以及输出到文件、网络等。 组件在运行期有4种状态,并且只能在相邻的两个状态之间发生转换:( 1)缺省状态GST_STATE_NULL ,所有的运行期的资源包括共享库以及内存等都没有分配;(2)准备状态GST_STATE_READY ,此时运行期的资源已经被分配,但是还没有媒体数据;(3)暂停GST_STATE_PAUSED ,组件 准备接收或者处理数据,Sink 组件此时接收到一个Buffer 的数据后便阻塞,等待下一个状态;(4)播放状态GST_STATE_PLAYING ,和暂停状态类似,不同的是Sink 组件此时真正开始输出接收到的媒体数据[1]。 2.2管道 箱柜Bin 是一个容器组件,用来组合其他的组件。管道是一种特殊的箱柜,它能够调度其容器中的所有组件。因为箱 柜本身也是一个组件对象,因此可以组件的编程接口API 同样适用于箱柜对象。比如,可以通过改变一个箱柜的状态,来改变其容器中的所有组件的状态。箱柜对象也会向应用程序转发来自其容器中组件的总线消息,比如出错消息、tag 标记消息、结束消息。 管道是最顶层的箱柜对象。当把管道的状态设成暂停或者播放状态时,媒体数据便开始在管道的组件中流动,并且相应的组件开始处理数据。此时,GStreamer 便会为该管道开启一 基于GStreamer 的MP3播放器开发 陈玲 (南京晓庄学院,南京211171) 摘要:GStreamer 是Linux 系统中广泛运用的基于管道设计的开源多媒体框架。概述了GStreamer 的架构以及其基本的编程概念,讨论了基于GStreamer 框架开发MP3播放器的设计与实现方法。关键词:GStreamer ;多媒体框架;MP3播放器;插件 The Development of MP3Player Based on GStreamer CHEN Ling (Nanjing Xiaozhuang University ,Nanjing 211171) Abstract:GStreamer is widely used Linux system design based on open source multimedia framework pipeline.This paper summarizes the overview of GStreamer architecture and its basic concept,and then discusses the method of design and im -plementation of a MP3Player based on GStreamer framework. Key words:GStreamer ;Multimedia Framework ;MP3Player ;Plug-in 收稿日期:2010-05-11 媒体播放器 录音机应用 照相机应用 应用程序 GStreamer 核心框架类型识别 插件机制 格式协商 消息总线 GStreamer 框架 数据输 入插件数据处理插件数据输出插件音频驱动ALSA GStreamer 插件库 视频驱动V4L2 LCD 驱动 设备驱动 图1GStreamer 的系统框架 110--

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.accum else running_time= (NS.stop - B.timestamp) / NS.abs_rate + NS.accum stream_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: 媒体处于PLAYING状态时流逝的时间。 4、stream time: 媒体播放的位置(在整个媒体流中)。 如图2所示。 图2 Gstreamer时钟和变量图(引自Gstreamer文档)

一步一步创建GStreamer插件(ZZ)

一步一步创建GStreamer插件(ZZ) $git clone git://https://www.sodocs.net/doc/451329088.html,/gstreamer/gst-template.git2、进入目录gst-template/gst-plugin/src $cd gst-template/gst-plugin/src $../tools/make_element ExampleFilter产生文件 gstexamplefilter.c gstexamplefilter.h3、修改Makefile.am文件(注意:是src目录下的Makefile.am) $sudo gedit Makefile.amplugin_LTLIBRARIES = https://www.sodocs.net/doc/451329088.html,libgstexamplefilter_la_SOURCES = gstexamplefilter.clibgstexamplefilter_la_CFLAGS = $(GST_CFLAGS) libgstexamplefilter_la_LIBADD = $(GST_LIBS)

libgstexamplefilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstexamplefilter_la_LIBTOOLFLAGS = --tag=disable-staticnoinst_HEADERS = gstexamplefilter.h总共有七行4、导入PKG_CONFIG_PATH环境变量,在命令行输入:$export PKG_CONFIG_PATH=/usr/lib/pkgconfig5、进入目录 gst-template/gst-plugin,修改文件autogen.sh 进入上一层目录 $cd.. 编辑autogen.sh文件: $sudo gedit autogen.sh如果是通过CVS获取的模板,则修改原来的srcfile=src/main.c 为新的:

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的应用程序。对于想学习"如何编写插件"的朋友们, 我们建议你去参考<<插件编写指南(Plugin Writers Guide)>>。

gstreamer-core解析

介绍: 这片文档是基于gstreamer-0.10.35来讲的,详细介绍了gstreamer core里面提供的功能。如有问题请联系yxj_5421@https://www.sodocs.net/doc/451329088.html,,转载请标明出处。 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)。一个插件中可以包含一个或若干element。 Gstreamer core文件目录 Common 放一些共用的配置文件,主要是一些m4(备注1)类型的预处理文件Docs 放置文本文件,供开发人员查看 Gst gstreamer核心文件(提供给lib里面元件class实现的函数和core提供给app的函数) Libs gstreamer提供不可被应用调用的元件,是某些元件的parent class,封装了上面gst的函数 M4 m4类型的预处理文件 Pkgconfig 放置编译时pkgconfig(备注2)需要用到的pc文件 Plugins gstreamer提供一些最基本的elements Po 放置一些po(备注3)类型的文本文件,gstreamer打印输出的多国语言Scripts 安装卸载脚本

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

基于Gstreamer框架的ffmpeg流媒体编解码设计

Software Development ? 软件开发 Electronic Technology & Software Engineering 电子技术与软件工程? 43 【关键词】ffmpeg gstreamer 编解码 流媒体 把采集的yuv 格式通过ffmpeg 编解码库编码成h264格式,再通过网络传输到室内播放终端,在室内机终端设备再通过ffmpeg 解码器转换为yuv420p 格式,最终转换为RGB 格式,并在Linux 系统的ARM 平台上利用QT 图形化界面显示。最终实现了数字可视对讲系统功能实现的整个流程。 基于Gstreamer 框架的ffmpeg 流媒体编解码设计 文/王锋1 陆凯2 Gstreamer 是一个基于管道Pipeline 的多 媒体应用框架,采用C 语言编程,但是通过gObject ,将各插件封装成面向对象编程的工具。元件 Element 是Gstreamer 最重要和基本的对象类,通过插件Plugin 的形式提供,多个元件Elements 可以组合为箱柜bin ,并进一步聚合形成一个管道Pipeline 完成一个多媒体应用处理。目前是嵌入式Linux 最为常用的处理多媒体应用框架。我们主要是在ffmpeg 多媒体编解码的过程中加入Gstreamer 的应用框架。 1 基于gstreamer的流媒体可视对讲系统开发过程 Gstreamer 框架中使用gst-launch 命令进行流媒体播放,我们在开发过程中,主要使用gst-launch 在终端编译和运行一条pipeline 用于播放多媒体。gst-launch-0.10 或gst-launch-1.0一般ubuntu 系统自带,相关插件包可通过wget 下载opky 安装。由于是基于嵌入式ARM 芯片的流媒体开发,还需交叉编译相关 gstreamer 动态库移植到下位机平台,如glib 库、gstreamer 插件库libgstqt5videosink.so 、qt5lib 库libQt5GLib-2.0.so 、libQt5GStreamer-1.0.so 等。 开发过程中调用的gst 代码有gst-ffmpeg-0.11.2、gst-libav-1.14.4等。 1.1 用GStreamer作v4l2摄像头采集和输出到YUV文件 由于需要做摄像头的视频采集,所以首先在内核中添加视频采集模块Video4Linux2,它是一种内核设备驱动,主要为Linux 下的应用程序编程提供视频设备接口函数,同时,由于我们是基于GStreamer 框架开发,故在v4l2摄像头采集中加入GStreamer 插件的方式进行开发。其中 Video4Linux2插件是一个用于捕捉和播放视频的API 和驱动框架,支持一般的摄像头设备。 v4l2本身不仅仅是支持视频采集功能,它还支持其他的视频功能,元件v4l2src 属于Video4Linux2插件,用于读取Video4Linux2用户有更自由灵活的选择,丰富产品多样性满足需求;其次快捷支付扫码应用平台管理系统在传统微信支付、支付宝支付等第三方移动支付平台的安全保障的基础上,还提供了自己的一套安全保障措施,让用户享受更好用户体验的同时,给用户提供更好的资金安全保障;最后,快捷支付扫码应用平台管理系统还提供了支付分析、收入分析等统计和预测的功能,让用户可以简介明了地查阅相关收支记录与历史统计,方便用户对移动支付的整体控制与预期控制。 4 系统测试 经过内部测试和系统预发布测试,快捷支付扫码应用平台管理系统具有良好的系统适应性与兼容性,友好的操作界面,系统功能完善,操作直观方便,易学易用,能够与运用广泛的微信支付、支付宝支付无缝结合,实用性强,系统内拥有独立的安全检测机制,大大提高了系统的安全性,在保证用户体验的同时保障用户资金安全。 5 总结 <<上接42页 移动互联网的时代悄悄到来,智能手机及各式各样手持装置的日渐普及,消费者购物时使用的支付工具也面临着巨大改变,互联网到移动互联网,网络支付到移动支付,移动支付在短短数年间已经成为最火热的应用增长点。快捷支付扫码应用平台管理系统通过系统内后台模版配置和动态调整等为用户提供整合、高可用及动态弹性分配,能够快速部署和使用系统内数据存储信息,同时提升了传统资源下数据共享之间的关系,用来对快捷支付进行扫码应用,具体有支付分析、支付统计、支付保护等功能组成。经过内部测试和系统预发布测试表明,快捷支付扫码应用平台管理系统具有良好的系统适应性与兼容性,友好的操作界面,系统功能完善,操作直观方便,易学易用,安全可靠等优点,是一款值得推广实用的新型移动支付系统。 参考文献 [1]魏国强.移动运营商主导的移动电子商 务的支付模式研究[D].重庆:重庆大学,2012. [2]马近朱.新城镇化与第三方支付机构 的移动支付业务[J].北京:中国信用卡,2013(09):52. [3]王娜.对国内移动支付产业发展的思考 [J].北京:时代经贸:下旬,2016(01).89.[4]张海霞.我国移动支付商业模式探索[J]. 山西:山西科技,2014(01):13. [5]肖心怡.基于用户目标的以信息为中心的 手机交互设计[D].湖南:湖南大学,2014.[6]卢益清.中国移动支付现状与前景探析 [J].北京:卷宗,2015(09).143.[7]陈化南.NFC 成为移动支付主流技术[J]. 上海:电信快报网络与通信,2015(09):43. 作者简介 石宸彬,曲阜师范大学信息科学与工程学院网络工程2018级二班。 作者单位 曲阜师范大学信息科学与工程学院网络工程2018级 山东省曲阜市 276826

GStreamer应用程序开发手册

I. 介绍 GStreamer 是一个非常强大而且通用的流媒体应用程序框架。 GStreamer所具备的很多优点来源于其框架的模块化: GStreamer能够无缝的合并新的插件。但是, 由于追求模块化和高效率, 使得GStreamer在整个框架上变的复杂, 也同时因为复杂度的提高, 使得开发一个新的应用程序显得不是那么的简单。 这个指南试图帮助你了解GStreamer的框架(version 0.10.3.1)以方便你在GStreamer框架的基础上做开发。第一章节将重点关注如何开发一个简单的音频播放器, 通过对整个过程的讲解,力图使你能够理解有关GStreamer的一些概念。在之后的章节中,我们将讨论一些关于媒体播放(playback)控制的高级问题, 这些问题包括了录音、录象和编辑等等。 目录 1. 序言 1.1. GStreamer是什么? 1.2. 谁需要读这个手册? 1.3. 预备知识 1.4. 本手册结构 2. 动机与目标 2.1. 当前问题 2.1.1. 大量的代码复制 2.1.2. “一个目标”媒体播放器/媒体库 2.1. 3. 没有统一的插件管理机制 2.1.4. 拙劣的用户感 2.1.5. 网络透明度的规定 2.1.6. 与Windows? 的产品还存在差距 2.2. 设计目标 2.2.1. 结构清晰且威力强大 2.2.2. 面向对象的编程思想 2.2. 3. 灵活的可扩展性能 2.2.4. 支持插件以二进制形式发布 2.2.5. 高性能 2.2.6. 核心库与插件(core/plugins)分离 2.2.7. 为多媒体数字信号编解码实验提供一个框架 3. 基础概念介绍 3.1. 元件(Elements) 3.2. 箱柜(Bins)和管道(pipelines) 3.3. 衬垫(Pads)

gstreamer插件工作原理与流程分析

gstreamer插件工作原理与流程分析 gstreamer plugins的工作同所有的基于插件的程序的 工作原理类似,本质上都是通过读取动态库实现的,只需要每个动态库都实现某一个特定的接口就可以了,比如XX_init 等,gstreamer统一使用plugin_init。里面会有个像注册表一样的数据结构会存储所有的插件的信息。 (1)在应用程序启动时,会调用 gst_init--->gst_init_check。gst_init_check函数将用于初始化gstreamer函数库,建立内部的路径列表,注册内置元件以及加载标准plugins(插件)。 (2)在gst_init_check函数中将调用init_post函数,它将设置日志处理器函数,初始化gst_format,并为 gst_object注册一系列类型等等。在init_post函数中还将调用gst_update_registry函数,强制gstreamer对它 的plugin所在路径进行重新扫描,并且更新默认的plugin registry(登记处,注册处)。读取注册库(处)信息是通过调用ensure_current_registry来实现的。首先,它会逐个去先后读 取系统环境变量GST_REGISTRY, GST_REGISTRY_UPDATE以及GST_REGISTRY_FORK。

其次,在读取完这些环境变量 后,程序将知道是否要更新registry。最后,调用 scan_and_update_registry函数,监测registry的变化并且 最终更新 registtry缓存。 (3)在上面提到的scan_and_update_registry函数中,将 会去读取GST_PLUGIN_PATH环境变量。在读取完环境变量后, 将先调用gst_registry_remove_cache_plugins清除过时的plugin消息,然后调用 gst_registry_binary_write_cache更新registry cache。 对于大部分gstreamer应用程序来说,执行到第三步骤后基本就可以认为是结束了。随后,所有的plugin加载,都是用户触发而进行动态加载的。(danny更正:2012-07-26)而对于没有定义 GST_DISABLE_OPTION_PARSING宏的应用程序来说,继续执行4和5步,以预先加载一些静态的插件程序。 (4)以上第(2)第(3)步结束后,也就是 ensure_current_registry函数调用返回到 gst_update_registry函数中。 if (preload_plugins) {

gstreamer的collectpad源码分析

gstreamer的collectpad源码分析 1. 背景: gstreamer的collectpad是一类特殊的pad,这类pad工作于收集模式,用于管理控制若干个pad组成的pad集合的数据同步处理。大部分的合成器(muxer)均使用collectpad 来收集音视频数据,并根据可重载的收集条件判断函数对不同pad之间的数据进行处理(或同步)。 由于collectpad中大部分处理函数均可重载(set_func),因此本文只讨论默认的处理函数。 2. 默认流程: collectpad的简单流程如下图: 不同的pad工作与不同的线程中,当某一个pad有数据到来时,会对所有pad进行判断,看看是否可以满足收集条件,如果满足收集条件就向对应的element推送数据。如果不满足收集条件,就会将该线程挂起,等待其他线程的数据。 当某个pad处于挂起时,其他pad收到数据后,一样会对收集条件进行判断,如果满足条件,会将所有pad的数据推送至element,同时广播条件变量,唤醒所有挂起中的其他pad(线程)。 简单的函数调用关系如下:

3. 数据结构: 数据结构如下:一个_GstCollectPads中维护了一个_GstCollectData的链表,每个pad对应一个_GstCollectData,其中记录了pad中的数据的时间戳,buffer,已经对应pad的状态(如锁、等待等标志位),GstCollectPadsPrivate中则记录了collectpad中注册的各种事件回调函数,这里的回调函数都有接口可以进行重载。此外,GstCollectPadsPrivate还维护了线程间同步用的锁和条件变量。 [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 /** * GstCollectPads: * @data: (element-type GstBase.CollectData): #GList of #GstCollectData managed * by this #GstCollectPads. * * Collectpads object. */ struct _GstCollectPads { /* 基类。*/ GstObject object; /*< public >*/ /* with LOCK and/or STREAM_LOCK */ /* 所有PAD的集合。*/ /* * GstCollectData: * @collect: owner #GstCollectPads * @pad: #GstPad managed by this data * @buffer: currently queued buffer. * @pos: position in the buffer * @segment: last segment received. * @dts: the signed version of the DTS converted to running time. To access * this memeber, use %GST_COLLECT_PADS_DTS macro. (Since 1.6)

gstreamer的安装和简单的mp3编写

gstreamer的安装和简单的mp3编写 为了使贪吃蛇在吃到食物时,能够发出声音。网上找到gstreamer可以在windows下使用,相 当于windows下的directshow。 Gstreamer简单介绍: GStreamer 作为GNOME 桌面环境推荐的流媒体应用框架,采用了基于插件(plugin)和管道(pipeline)的体系结构,框架中的所有的功能模块都被实现成可以插拔的组件(component), 并且在需要的时候能够很方便地安装到任意一个管道上,由于所有插件都通过管道机制进行统一的数据,因此很容易利用已有的各种插件“组装”出一个功能完善的多媒体应用程序。 这篇文章“用GStreamer 简化Linux 多媒体开发”对GStreamer的概念介绍的挺好的. https://www.sodocs.net/doc/451329088.html,/developerworks/cn/linux/l-gstreamer/ 在linux安装gstreamer: 1.去https://www.sodocs.net/doc/451329088.html,/下载源码包 一般要安装gstreamer以下最基本的包,分别下载: gstreamer gst-plugins-base gst-plugins-good 2.安装gstreamer: 解压后,进入目录直接执行./configure,可能会出错,如提示缺少bison,flex等,运行apt -get install bison安装 make make install 3.安装gst-plugins-base: 安装前要设置环境变量,由于gstreamer是默认安装,没有设置--prefix,所以将export PKG_CONFIG_PA TH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PA TH就行了 ./configure,提示缺少liboil,去https://https://www.sodocs.net/doc/451329088.html,/ubuntu/+source/liboil/0.3.14 -3下载安装即可 make make install 4.安装gst-plugins-good: ./configure make

gstreamer教材

國立中央大學 資訊工程研究所 碩士論文 基於網路行動裝置所設計 可擴展的服務品質感知GStreamer模組 An Expandable QoS Aware GStreamer Module Plug-in Design for Portable Internet Device 研究生:邱日成 指導教授:吳曉光博士 中華民國九十八年七月

摘要 隨著電腦網路、硬體以及多媒體等相關技術迅速地發展,我們不再只是像以前一樣,從電視觀看影音娛樂,近日我們更可以透過網際網路抓取檔案,並在手持裝置上觀賞我們想看的多媒體內容。然而,單靠手持裝置有限的計算能力是無法提供高品質的影音娛樂,於是,手持裝置皆開始採用硬體解碼。 但是硬體解碼無法直接被現有的播放器使用,需要透過修改撥放器程式或是撰寫額外的套件來被使用,然而,不同的硬體解碼套件有許多相似的部分,開發者往往花費大量的時間做相同的事。因此將重覆的部分設計成一個標準流程,以加快開發的速度。 在本篇論文中,我們將焦點放在設計套件的擴展性和服務品質管理上。為了讓之後可以輕易的增加新的硬體解碼和服務品質感知的方法,我們將在本論文中提出一個解決方案,並說明所遇到的問題及解決方法。以實現一個高擴展性且有服務品質感知的解碼套件供之後的開發者使用。

Abstract As computer networks,hardware and multimedia technologies grow rapidly,we not only receive audio and video information from tele-vision as we used to do.Recently we can get multimedia?le from Internet.Moreover,we can playback these?les on the mobile hand-held device.However,the computing power of mobile handheld de-vice is not enough to provide a high quality amusement of multimedia. Therefore,hardware decoder was introduced to solve this problem on the mobile handheld device. But media player nowadays cannot use hardware decoder directly. It is necessary to modify player or develop plug-ins for hardware de-coder.However,there are some similar parts with each other.So the developers usually spend much time at do the same things.There-fore,we design a standard process that deals with the similar parts for reducing the development time. In this paper,we would like to focus on designing the expandable QoS plug-in.In order to add new hardware decoder and QoS rule easily,we point out the key problems that we encounter and propose a solution to solve them.Our main goal is to implement an expandable

Gstreamer工作原理分析

Tech Gstreamer工作原理分析 Guide

目录 1.ABSTRACT (3) 2.INTRODUCTION (3) 3.原理分析 (3) 3.1术语介绍. (3) 3.1.1元素 (3) 3.1.2一些特别的元素。 (3) 3.2插件的工作原理。 (5) 3.3G ST-LAUNCH的工作逻辑 (7) 3.4动态PIPELINE的创建原理 (9) 3.5D ECODEBIN的工作原理 (10) 3.6T YPEFIND的实现原理 (12) 3.7S ETUP ELEMENT (12) 3.8P LAYBIN的工作原理 (14) 3.9数据流动 (16) 3.10总结 (20) 4.REFERENCE (20)

1. Abstract 主要讲的是gstreamer的工作原理,包括gst-launch的分析和playbin的分析,以及数据的流动分析。 2. Introduction 先介绍一些术语,然后介绍了插件的工作原理,后面接着介绍了 gst-launch,playbin,decodebin,typefind,数据流动. 3. 原理分析 3.1术语介绍. 3.1.1 元素 代码里面的类型是GstElement,可以理解为gstreamer里面的基类。 3.1.2 一些特别的元素。 Source:可以理解为源头,也就是数据流的起始地,就像长江的发源地是沱沱河一样。 Sink:就是这个数据流最终要流向的地方,就像长江最终要流向东海一样。 Filter:过滤器,就像是筛子一样滤掉我们不感兴趣的东西,流下我们想要的东西,或者从代码上来说就是拦截下数据,对这个数据做一定的修改或者其它动作,当然你什么也不做也是可以的,然后再把数据传出去: Pipeline:典型的pipeline是这样的:

SUSE10环境下gstreamer安装全记录

SUSE10.2环境下gstreamer安装全记录 1.安装gstreamer (gstreamer-0.10.29.tar.gz) # tar xzf gstreamer-0.10.29.tar.gz # cd gstreamer-0.10.29/ # ./configure 出现错误: configure: Requested 'glib-2.0 >= 2.18' but version of GLib is 2.8.6 configure: error: This package requires GLib >= 2.18 to compile. 2.安装glib (glib-2.24.1.tar.gz) # tar xzf glib-2.24.1.tar.gz # cd glib-2.24.1/ # ./configure # make # make install 3.返回安装gstreamer # cd ../gstreamer-0.10.29/ # ./configure 又出现错误: configure: error: Need libxml2 and development headers/files to build GStreamer. You can do without libxml2 if you pass --disable-loadsave to configure, but that breaks ABI, so don't do that unless you are building for an embedded setup and know what you are doing. 4.安装libxml (libxml2-2.7.4.tar.gz) # tar xzf libxml2-2.7.4.tar.gz # cd libxml2-2.7.4/ # ./configure 最后出现: /bin/rm: cannot remove `libtoolT': No such file or directory Done configuring 没报错,就不管它,继续 # make # make install 5.再次返回安装gstreamer # cd ../gstreamer-0.10.29/ # ./configure 总算是成功了,出现提示: Configuration

相关主题