gstreamer应用程序开发手册,gstreamer框架
Gstreamer基础知识:
1.gstreamer的基本概念
2.gstreamer初始化、组件和库
3.gstreamer总线、pad、缓冲器、事件
为什么需要看gstreamer教程:deepstream是基于gstreamer开发的,引用了大量gstreamer中的插件或者自制插件。没有gstreamer的基础,很难理解代码流程。看完gstreamer,一切都变得豁然开朗~
1.序言本章将从技术角度描述本手册的整体结构。
1.1、什么是GStreamer?GStreamer是一个创建流应用程序的框架。GStreamer的程序开发框架使得编写任何类型的流媒体应用程序成为可能。GStreamer并不局限于音频和视频处理,它可以处理任何类型的数据流。流水线设计的方法对实际滤波器几乎没有负载,甚至可以用来设计对延迟要求很高的高端音频应用。
GStreamer更像是一个玩家。但是它的主要优点是它的可插拔组件可以很容易地连接到任何管道。GStreamer框架是基于插件的。一些插件提供各种多媒体数字信号编解码器,而其他插件则提供其他功能。所有插件都可以链接到任何已定义的数据流管道。GStreamer的管道可以通过GUI编辑器进行编辑,并保存为XML文件。这种设计使得管道链接库的消耗非常小。
1.2.初步知识GStreamer一直采用GObject编程模式。此外,阅读完本手册后,请阅读GStreamer插件作者指南。当然,你还需要关注其他GStreamer文档。Plugin WritersGuide)-支持三种语言:c/js/python:
https://gstreamer . free desktop . org/documentation/tutorials/index . html?地理语言=c
2.动机和目标GStreamer旨在解决当前Linux多媒体存在的问题。
2.1、当前问题1)大量代码抄袭。
对于想要播放一个声音文件的Linux用户来说,他们不得不搜索各种声音播放器来播放不同格式的文件,而这些播放器大多数都是一遍又一遍地重复使用相同的代码。
对于希望在应用程序中嵌入视频剪辑的Linux开发人员来说,他们不得不使用粗略的方法来运行外部视频播放器,因为没有可供开发人员创建可定制播放器的库。
2)“一个目标”媒体播放器/库
一个典型的MPEG播放器可以播放MPEG视频和音频,大多数播放器实现了一个完整的基础设施来实现他们唯一的目标:播放。没有有效的机制来为音频和视频数据提供过滤和效果处理,并且没有向视频或音频数据添加过滤器或特殊效果的规定。
如果你想将MPEG-2视频流转换成AVI文件,那么你最好的选择是将所有的MPEG-2解码算法从播放器中分离出来,并复制到你的AVI编码器中,因为这些算法不能简单地在应用程序之间共享。开发人员试图创建一个可以处理多种媒体类型的库,但由于缺乏通用的API,如何将其集成成为一项重要的工作。因为在集成的过程中,我们需要注意一些特殊的媒体类型(avi文件,libmpeg2,),而整合这些媒体类型文件需要统一的接口。GStreamer允许将这些库与通用API打包在一起,从而简化集成和重用。
3)没有统一的插件管理机制。
典型的播放器对于不同的媒体类型有不同的插件,两个媒体播放器会实现不同的插件机制,所以编解码器不能方便的互换。每个典型的媒体播放器的插件管理系统都有其特定的应用需求。缺乏统一的插件机制已经严重阻碍了二进制编解码器的发展,因为没有公司愿意将代码移植到不同的插件机制上。GStreamer当然采用了自己的插件系统,为插件开发者提供了非常丰富的框架,从而保证了这些插件可以被广泛使用,并且可以与其他插件无缝交互。GStreamer为插件提供了一个灵活的框架,可以满足大多数插件的需求。
4)用户意识差
因为以上问题,应用开发者花了相当多的时间在如何处理后端,插件机制等等。导致大部分项目时间延迟,往往导致后端和用户界面无法完成,导致用户感受不佳。
5)没有提供网络透明性。
目前,没有允许网络透明媒体操作的底层框架。有趣的是,分布式MPEG编码器可以复制非分布式编码器的相同算法。没有关于使用GNOME和KDE桌面平台的技术规范。因为GNOME和KDE桌面平台本身仍在改进和完善,很难将多媒体恰当地集成到许多用户的环境中。注意GStreamer还提供了很多方法将GStreamer与不同的桌面系统集成(参见附录中的集成部分),但是这些方法往往不是网络透明的。
GStreamer内核并没有在底层采用网络透明技术,而是在顶层添加为本地使用。也就是说,创建核心组件包变得更加容易。GStreamer允许管道在tcp协议上分离,使用TCP插件实现GStreamer数据协议,包含在gst-plugins模块中,目录gst/tcp。
2.2.设计目标我们将阐述GStreamer开发中的目标:
1)结构清晰,功能强大
GStreamer为以下开发人员提供了一组清晰的接口:
希望构建媒体管道的应用程序程序员。程序员可以使用一系列强大的工具来创建媒体通道,而无需编写一行代码,从而使复杂的媒体控制变得非常简单。
插件程序员。GStreamer为插件程序员提供了一个简洁简单的API来创建自插件(自包含)插件,同时集成了大量的调试和跟踪机制和工具。GStreamer还提供了一系列实际例子。
2)面向对象的编程思想
GStreamer依附于GLib 2.0对象模型,熟悉GLib或者老GTK的程序员都会熟悉GStreamer。GStreamer采用了信号和对象属性的机制。在运行状态下,可以查询对象的所有属性和功能。GStreamer在编程方法上与GTK非常相似,需要对象模型、对象所有权和引用计数。
3)灵活且可扩展的性能
的所有GStreamer对象都可以通过GObject继承的方法进行扩展。所有插件都可以动态加载,并且可以独立扩展或升级。
4)支持插件以二进制形式发布。
发布为共享库的插件可以在运行状态下直接加载,插件的所有属性都可以通过GObject属性来设置,不需要(实际上永远不需要)安装插件的头文件。我们更注重插件的独立性,运行时需要很多与插件相关的因素。
5)高性能
高性能主要体现在:
使用G_mem_chunk和GLib的非模块化分配算法来最小化内存分配。
插件之间的连接是非常轻量级的。数据管道中的数据传输使用最小消耗,管道中插件之间的数据传输只涉及指针放弃。
提供一组直接在目标内存上操作的机制。比如插件可以直接将数据写入X server共享的内存空间,缓冲区也可以指向任意内存,比如声卡内部的硬件缓冲区。
计数和写入副本会最小化memcpy。子缓冲器有效地将缓冲器分成可管理的块。
使用线程联合(cothreads)来减少线程消耗。Co-threads是一种简单而高速的切换子程序的方式,它被用作衡量600个cpu周期的最小消耗的标准。
使用特殊插件支持硬件加速。
使用说明向插件注册,这样插件将只在实际需要时加载。
的所有判断数据都不使用互斥。
6)核心库与插件(核心/插件)的分离
GStreamer内核的本质是与媒体无关的。我们知道的只有字节和块,以及基本的组件。GStreamer内核强大的功能甚至可以实现底层的系统工具,像cp。的所有媒体处理功能都由插件从外部提供给内核,并告诉内核如何处理特定的媒体类型。
7)提供多媒体数字信号编解码实验框架。
GStreamer成为一个简单的框架,编解码器的开发人员可以尝试各种算法来加速开源多媒体编解码器的开发,如Theora和Vorbis。
3.基本概念介绍本章将介绍GStreamer的基本概念。理解这些概念对你后续的学习非常重要,因为我们都假设你在后续的深入讲解中已经完全理解了这些概念。
3.1.元素组件是GStreamer中最重要的概念。您可以创建一系列组件(元素)并连接它们,以便数据流可以在连接的组件(元素)之间传输。每个组件(元素)都有一个特殊的功能接口。对于某些组件(元素),它们用于读取和解码文件数据。某些元素的功能接口只将相应的数据输出到特定的设备(例如声卡设备)。您可以将几个元素连接在一起,创建一个管道来完成特殊任务,如媒体播放或录制。GStreamer默认安装了很多有用的组件。通过使用这些组件,您可以构建具有多种功能的应用程序。当然,如果你需要,你可以自己写一个新的组件(元素)。GStreamer PluginWriter指南中详细解释了如何编写组件的主题。
组件:最小的封装功能模块,可以读取文件、解码文件或输出文件。编写您自己的组件参考文档:
Plugin WritersGuide)-支持三种语言:c/js/python:
https://gstreamer . free desktop . org/documentation/tutorials/index . html?地理语言=c
3.2.垃圾箱和管道。箱柜是一种可以装载组件的容器。管道是容器的特殊子类型。管道可以操作自身包含的所有元素。因为bin本身是元素的子集,所以可以像操作普通元素一样操作bin,这可以降低应用程序的复杂性。您可以更改一个框的状态,以更改框内所有元素的状态。bin可以向其子集元素发送总线消息(这些消息包括:错误消息、标签消息和EOS消息)。
箱柜:
1)安装在组件中的容器;
2)它是组件的子集,与组件操作方法相同;
3)改变仓的状态以改变仓内所有元素的状态;
4)机柜可以向其子集组件发送总线消息。
管道是高级容器。当秀陈文静设置管道的暂停或播放状态时,数据流将开始流动,媒体数据处理也将开始。一旦启动,管道将在单独的线程中运行,直到停止或数据流播放完毕。
管道:
专用机柜,设置流水线暂停或播放状态,数据开始暂停或流动,运行在单独的线程中。
3.3.Pads Pads用于链接GStreamer中的多个组件,以便数据流可以在这样的链接中流动。焊盘可以看作是一个元件的插座或者端口,元件之间的链接依赖于焊盘。pad具有处理特殊数据的能力:pad可以限制数据流类型的通过。只有当两个pad允许的数据类型相同时,才能建立成功的链接。数据类型设置使用一种称为危机的睫毛协商的方法。数据类型由GstCaps变量描述。
以下类比可能有助于您理解Pads。Pads很像物理设备上的插头。例如家庭影院系统。家庭影院系统由放大器、DVD播放器和无声视频投影组成。我们需要将DVD播放器连接到放大器,因为这两个设备都有音频插座;我们还需要将投影仪连接到DVD播放器,因为这两个设备都有视频处理插座。但是我们很难把投影仪和放大器连接起来,因为它们处理的是不同的插座。GStreamer衬垫与家庭影院系统中的插座具有相同的功能。
大多数情况下,所有数据流都在链接的元素之间流动。数据可以通过一个或多个源焊盘流出到元件外部,并且元件通过一个或多个宿焊盘接收数据。源元件和宿元件分别只有一个宿焊盘或源焊盘。这里数据表示缓冲区)(GstBuffer对象描述数据缓冲区的信息)和事件(GstEvent对象描述数据事件的信息)。
垫片:组件的接口。
门户:整理深流系列文章分类目录