流媒体应用框架GStreamer学习总结(一)基础概念

概念

Gsreamer诞生背景—Linux平台媒体处理劣势

Linux 在多媒体方面已经远远落后于其它的操作系统。Microsoft’s Windows 和 Apple’s MacOS 它们对多媒体设备、多媒体创作、播放和实时处理等方面已经有了很好的支持,GStreamer 正是为解决 Linux 多媒体方面当前问题而设计的。
Linux多媒体典型问题:1、各种数据格式都有自己独立的播放器,各种不同地方格式播放器代码大量重复,没有一套统一的库;2、没有一套有效的机制进行音视频数据过滤和效果处理。3、没有统一的插件管理机制,难以方便的做定制化开发。

GStreamer介绍—一个开源流媒体应用框架

gstreamer是一个灵活、快速,跨平台的开源流媒体应用框架。
gstreamer框架是基于插件和数据管道的,部分插件提供各种多媒体数字编译码器或者其他功能,可以方便的添加组件到任意管道中。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了DirectShow的设计思想。
GStreamer设计目标
1、构建流媒体管道的应用程序员,使用插件和工具来创建管道,不需要编写代码。
2、针对插件程序员,提供简介简单的API创建插件,支持大量调试和跟踪机制或工具。
3、采用信号与对象属性机制,所有对象属性和功能都能运行使查询。
4、所有对象使用GObject继承的方法进行扩展,全部插件可以动态加载,可以独立扩展和升级。
5、支持插件以二进制方式发布;
6、高性能,数据在管道间传递尽可能小;提供一套目标内存直接操作机制,如声卡内部硬件缓冲区;可以使用特殊插件支持硬件加速;使用线程联合监视线程消耗;所有判断数据不用互斥锁;使用子缓存区进行缓存区分离管理。
7、核心库与插件分离;

GStreamer 业务基础概念

组件Elements—数据处理黑盒子

组件:就是一个数据处理的黑盒子,数据从一端输入另一端输入出。
1、组件的分类:1)、源组件Source element:只有一个源衬垫,为管道产数据,如磁盘或者声卡读取数据。2)、过滤器组件:拥有(任意个)输入和输出衬垫,从输入得到数据操作后提供给输出,如过滤器filters,转换器convertors,分流器demuxers,整流器muxers,编译码器codecs。3)、接受组件:媒体管道末端,接受数据不产生数据,如写磁盘,播放声音,视频输出。
2、组件状态:
GST_STATE_NULL: 默认状态。该状态将会回收所有被该组件占用的资源;
GST_STATE_READY: 准备状态。组件会得到所有所需的全局资源,这例如打开设备、分配缓存等。
GST_STATE_PAUSED: 暂停状态。组件已经对流开始了处理,但此刻暂停了处理。可以修改流的位置信息等;
GST_STATE_PLAYING:播放状态。管道会自动处理数据。它们不需要任何形式的迭代。
在这里插入图片描述

衬垫Pads—组件的数据端口

衬垫:用于多个组件的链接,可以视为组件的插座或者端口 ,一个衬垫能够限制数据流类型的通过,只有两个衬垫允许通过数据类型一致就可以被建立。
1、衬垫分类:衬垫数据导向分类:源衬垫和接受衬垫。衬垫时效性分类:永久性always,随机(动态)性sometimes(按条件创建),请求型on request(按请求创建);

2、衬垫功能capabilities:描述所有可能通过该衬垫的媒体类型。主要用途:1)、自动填充(Autoplugging): 根据组件的功能自动找到可连接的组件。 2)、兼容性检测(Compatibility detection): 当两个个衬垫连接时,GStreamer 会验证它们是否采用的同样的数据流格式进行交互。 3)、元数据(Metadata): 通过读取衬垫的功能,能够提供有关当前流经衬垫的正在播放的媒体类型信息。这个信息我们叫做元数据(Metadata)。4)、过滤(Filtering): 通过衬垫的功能来给两个交互的衬垫之间的媒体类型加以限制,这些被限制的媒体类型的集合应该是两个交互的衬垫共同支持的格式集的子集。

3、衬垫模板pad templates:衬垫模板 可以用来创建指定功能的实例。

4、衬垫实例:衬垫实例就是模板的一个拷贝生成(类似 类和对象的概念)。

管道pipline—媒体数据通路

管道:通过一系列组件进行连接 从而创建一个管道,让数据在组件间传输。
一个源组件+任意个过滤组件+一个接受组件 链接在一起,建立起一个媒体管道。
在这里插入图片描述

箱柜Bins—容器组件(组件组合成一个大的逻辑组件)

箱柜是一种容器组件。你可以往箱柜中添加组件。由于箱柜本身也是一种组件,所以你可以像普通组件一样操作箱柜。
在这里插入图片描述

总线Bus与消息类型Message types—消息分发处理机制

总线是一个简单的系统,它采用自己的线程机制将一个管道线程的消息分发到一个应用程序当中。每一个管道默认包含一个总线,应用程序只需要在总线上设置一个类似于对象的信号处理器的消息处理器。当主循环运行的时候,总线将会轮询这个消息处理器,消息被采集后呼叫相应的回调函数完成任务。总线上管道和应用程序之间的交互是异步的。

消息:GStreamer有几种由总线传递的预定义消息类型,这些消息都是可扩展的。插件可以定义另外的一些消息。所有的消息都有一个消息源、类型和时间戳。
消息典型分类:
1)、错误、警告和消息提示:错误信息表明有致命的错误并且终止数据传送,修复才能继续工作。警告暗示有问题存在。消息提示用来告知非错误的信息。这些消息含有一个带有主要的错误类型和消息的 GError,和一个任选的调试字符串。可以用gst_message_parse_error (), _parse_warning () 以及 _parse_info ()三个函数来提取其信息。当使用完毕后,错误和修正字符串都将被释放。
2)、数据流结束(End-of-stream)提示:消息被发送管道的状态不会改变,但是之后的媒体操作将会停止。应用程序可以通过收到这一消息来跳到播放列表的下一首歌。
3)、标签(Tags):当元数据在数据流中被找到的时候发送。一个管道可以发出多个 Tag(如元数据的描述里有艺术家、歌曲名等)。应用程序应该将元数据存储在缓存里。gst_message_parse_tag () 用来解析 tag 列表,该列表不再使用时函数 gst_tag_list_free () 释放。
4)、状态转换(State-changes):当状态成功的转换时发送该消息。函数gst_message_parse_state_changed ()可以用来解析转换中的新旧状态。
5)、缓冲(Buffering):当缓冲网络数据流时此消息被发送。通过函数gst_message_get_structure ()的返回值,来解析"buffer-percent" 属性,从而手动的得到缓冲进度(该缓冲进度以百分比的形式表示)。
6)、组件消息(Element messages):一组特殊的消息,标识一个特定组件,通常表述了一些额外的信息例如:‘qtdemux’ QuickTime 整流器(demuxer)应该把’redirect’信息保存于该组件信息当中,以便在某种特殊情况下将’redirect’组件信息发送出去。
7)、 Application-specific 消息:我们可以将取得的消息结构解析出来,从而得到有关 Application-specific 消息的任何信息。通常这些信息是能够被安全地忽略。

缓冲区Buffers—存放管道数据流

缓冲区包含了你创建的管道里的数据流。通常一个源组件会创建一个新的缓冲区,同时组件还将会把缓冲区的数据传递给下一个组件。缓冲区主要由以下一个组成: 指向某块内存的指针;内存的大小;缓冲区的时间戳;一个引用计数,指出了缓冲区所使用的组件数。没有组件可引用的时候,这个引用将用于销毁缓冲区。

事件Events—随着缓冲区发送的控制事件

事件是一系列控制粒子,随着缓冲区被发送到管道的上游和下游。
下游事件通知流状态相同的组件,可能的事件包括中断,flush,流的终止信号等等。上游事件被用于改变管道中数据流的状态,如查找。对于应用程序来说,上游事件非常重要,下游事件则是为了说明获取更加完善的数据概念上的图像。

原理学习(待更新)

GStreamer应用开发

GStreamer插件开发

GStreamer核心框架

基于GStreamer的开源应用

参考资料

gsreamer官网:https://gstreamer.freedesktop.org/documentation/?gi-language=c
《Gstreamer手册》

猜你喜欢

转载自blog.csdn.net/runafterhit/article/details/108312902