深入浅出gstreamer开发
Gstreamer解决什么问题?
—上层接口和应用方式的相对稳定与底层接口、平台环境的多样化。例如:codec不同种类不同实现,音视频处理不同,硬件输入、输出、采集播放不同,芯片不同,操作系统不同。
—通用组件不灵活与需求的多变。色彩空间转换、缩放、编解码等组件功能是单一的。通过对这些组件进行组合,就可以满足多变的需求。要想拥有模块性、可移植性和通用的功能,通常是以极高的复杂性为代价。
—计算机系统的万能解决办法:加一层!
—Gstreamer媒体控制程序作为中间件,它可以解析上层指令,并对底层进行控制。
Gstreamer基础
—所有的gstreamer应用都是基于gobject的。
—除了理解封装、继承、多态的模拟以外,理解this指针,vtable的实现原理也很有帮助。
—参照下图理解gobject对象。
深入浅出Gstreamer基础概念
—是一个管道化多媒体框架。管道的属性:包含一系列不同功能的链接起来的元件以及元件之间的数据流动;管道的行为:包含一系列多媒体操作,如元件链接等。
—一个元件,由时钟、衬垫、总线、状态等组成。
—衬垫(pad)一个元件与外界通信的接口。
—互相链接的元件构成一个箱柜(BIN)。BIN作为一个整体,本身也可被认为是一个元件。
—管道(pipeline)是一个特殊的bin,是最高级别的bin。
—每一个pipeline都有一个默认的总线,该总线会在一个mainloop里去检查消息,并触发相应你的callback,实现与应用程序的通信。Bus含一个队列,每次post一个消息就加到队列里,然后出发maincontext的wakeup。这样就完成了将消息路由到maincontext去了。因为maincontext等待的有这个bus队列。
—Caps代表一个媒体文件的能力,通常包括该文件的mime类型和多媒体属性。
—bin是一个装载元素集合的容器。管道是特殊的bin类型,允许执行其中的所有子元素。由于bin本身是元素子类(subclass),通常可以像控制元素一样控制bin,从而简化应用程序。比如,可以通过改变bin本身的状态改变bin中所有元素的状态。bin还可以转发来自bin中的子元素的总线(bus)消息(例如错误消息,标签消息和EOS消息)。
—管道是顶级bin。将它的状态设置为暂停(PAUSED)或播放(PLAYING)时,则数据流启动,媒体处理开始。启动后,管道将在一个单独的线程中运行,直到被停止或数据流结束。数据流动是以缓冲传递来实际工作的。Buffer可以看成是一种容器,里边含data和events。
—事件是一种控制数据,能够在管道中上下流动。一般来说,上游的控制命令可能是真的在控制什么,来自下游的events可能大多数是些状态通知之类的
元件状态
—NULL:默认状态,内部会释放单元的所有资源,其实就是初始状态。
—READY:就绪状态,分配资源,打开设备。但是流不会打开,所以此时流信息都是零。如果之前打开了流,在这状态中将会被关闭,流信息都会被重设。
—PAUSED:已经打开了流,但是暂时不处理它。这个时候可以去修改例如seek位置等流信息。时间轴停止
—PLAYING:时间轴运行。设置为这个状态后,整个流程就开始启动了。内部会将消息发送从管道所在的线程转移到应用程序线程
抓住gstreamer核心
Gstreamer Core,是gstreamer框架的骨干和核心。它提供的功能有:
(一)提供一些组件类型的基类的实现,以及这些组件之间的通信规则;
(二)提供给应用程序创建媒体实例的API,以及保证实例运行的各种机制API.
Gstreamer Core的本质是不在乎媒体文件是什么类型或什么格式的(media-agnostic),因为它不关心媒体编解码等具体细节。可以认为它是一个最高级的管理者和组织者,它提供了一个流媒体程序框架或者叫做蓝图,下属人员可以通过领会它的旨意去具体开展工作;你也可以理解它为一个服务供应商,提供了一切多媒体应用程序可能需要的元件,开发人员可以利用它来去实现自己的专属程序。Gstreamer在初始化时只注册了核心元件,包括bin和pipeline,用户需要以此为基础,实现自己的多样化的多媒体管道程序。多媒体应用程序的实现,需要用户自己利用好gstreamer,然后实现自己的东东。
插件如何管理
把握core/plugin的重要联系
—Core/plugin是不同的模块。他们的存在都是为特定的多媒体控制程序服务的。特定的Plugin主要由媒体控制开发者提供,而core是所有基于gstreamer程序的共同体。
—Core里用到的每个element实际就是一个插件,在gst中得到组装成一个pipeline,数据从源单元流向目的单元,完成整个流程。单元间是可以链接起来的(必须得链接起来以组成pipeline).
—应用程序通过core使用factory_make和gst_object_unref函数来创建及释放元件。make需要两个参数,一个是工厂名,一个是单元名。工厂名实际就是插件名,所以需要先加载插件上来,才能创建对应的元件。作为工厂(插件),其功能还不仅限于创建元件,一个工厂有属性,它知道自己能创建怎样的元件。
Gstreamer核心类图
Gstreamer插件相关类图分析(可参考我上一篇文章)
Pipeline工作时序图
Smith先生版权所有,如需转载,请注明出处:http://blog.****.net/acs713/article/details/7777946
否者,保留追究其法律责任的权利相关推荐
- 用vue开发的页面使用overflow为auto后显示不全的问题
- 移动开发已进入 App 工厂时代!
- Android开发项目--跑腿APP-跑儿
- PYNQ-Z1开发板通过QSPI FALSH启动UBOOT
- ECMBoss企业内容解决方案项目系列之(二)人力资源整合组建项目精英开发团队...
- 使用恩智浦MCUXpresso开发FRDM-KL46Z入门
- 学习开发VBA程序所需开发环境及配置
- 记录参加微软打造开发者社会生态圈线下会议
- [DeeplearningAI笔记]ML strategy_2_2训练和开发/测试数据集不匹配问题
- 关于程序员开发效率的悖论
- Cannot find module ‘babel-plugin-xxxx‘ 报错解决方案
- 【EOS币价格分析】支撑位可能下探至3美元:EOS币价格分析