Gstreamer说明(2)

基本例子

这部分对应第10章,不打算介绍了。做到能看懂代码为准。

或者自己可以想想该怎么写一个这样的例子,能解释清楚里边的API调用次序和关系等。

看明白了,看来要使用一个gst还是相对比较容易的。但是要开发一个插 件,可能难度就大很多了。尤其是里边的Buffer,事件之类的东西。争取2周搞定。

高级部分

5.1 查询与Seek

查询主要是获得进度信息(播放电影的时候那个进度条位置)。

seek与查询类似,seek的完成通过event方式来发送控制命令。

1. GST中的查询

GST为查询提供了丰富的接口,例 如当前时间戳,当前读取帧数等信息,都可以查询到。

questions:在哪儿查?查哪个单元,怎么查?

Answer:估计是查pipe。 调用gst_element_query

内部处理是先将该query发到sink单元,然后向上找看哪个单元能够处理,处理完了再把结果返回给调用程序。一般demuxer能够处理。

 

2. Seek

处理逻辑与查询类似。针对seek请求,单独可以构造一个gst_event_new_seek出来。

一个seek请求包含很多参数,这里不详述了。

有几个可以猜想到:seek的位置,seek多少等。

有一个标识关于是否刷新内部buffer的似乎很重要。

当处于PAUSEDPLAYING状态的时候,需要这个FLUSH标示。因为seek完了后,会回到以前的状态。

你可以等待seek真正完成,用:

l         gst_element_get_state

l         或者等到ASYNC_DONE消息

另外,只能在PLAYING状态下设置无FLUSH标示。seek命令的完成可能是在另外一个线程来做的。内部处理逻辑如下:

l         pause,如果开始是playing状态的话,位置信息将被重置

l         中间单元将重新位置处开始处理,直到sink单元收到数据,如果之前是play状态,则seek完成后也是play状态

 

5.2 元数据信息

MetaData应该是描述媒体文 件信息之用的。gstMD分为两类:

l         标签信息(除媒体视音频格式之外的其他信息,例如属于哪个专辑,什么流派之类的),这类信息 由GstTag系统完成

l         视音频格式信息,这个由pad完成

1. Tag信息读取

这个是通过管道的bus来读取的。可以监听GST_MESSAGE_TAG来完成。

2. Tag写入

使用GstTagSetter来完成,而且该单元必须支持tag设置。

奇怪,怎么设置?源一般按普通文件打开的,没法设置啊。

所以必须先从管道中找到那些能设置的。通过:

l         gst_bin_iterate_all_by_interface(GST_TYPE_TAG_SETTER)

l         然后调用gst_tag_setter_add等函数。

看了下manualTagsetter是 一个接口,必须有类实现这个接口就可以了。

5.3 接口组合

接口类定义了一个实现单元应该支持的功能。

1. URI接口

其实就是定义一个支持通用路径的接口。

例如本地文件用file:////,网页文件用http://

怎么获得一个支持特定URI地址的单元呢?

l         gst_element_make_from_uri,可以指定SRCDST

创建一个支持特定URI地址的单元。

2. MIXER接口

支持对硬件或软件音量的统一管理。一般那些直接和声卡硬件打交道的单元用实现这个接口。

有哪些功能呢?比如静音,调整左右声道等功能。

一般不要在播放中使用这种接口来控制音量,相反,应该使用sink单元的音量属性来控制。

也是啊,一般控制本地程序即可,不用去调节全局声卡的音量呀。

3. Tuner接口

用于调整多输入输出设备的,可能还是和硬件关系比较紧密。

4. 色彩平衡接口

用来调节亮度,对比度等内容的。

5. 属性探测接口

主要用途是来自动探测硬件设备的。

6. X重叠接口

X意味X-Window,主要是绘图用。

 

5.4 时钟

GST中使用时间的原因是:

l         有些单元提供了时钟,要是管道中没有时钟的话,就会用默认的系统时钟

l         有些单元根据时钟干活(clock slaves

GST中时间有好几种:

l         时钟时间,就是普通时间,一直增加的

l         基础时间:其实就是开始时间

l         运行时间:播放的时间,包括重播,回播种种之和

l         流时间:这个可能真的是一个单次播放的时间,例如一次重播,一次完整播放等

1. 时钟提供者

为何存在这个?因为有些视音频文件必须按照媒体自己的时间来走,而不是系统的时间频率。

2. 时钟使用者

管道会有一个时钟,然后给其他时钟使用者使用,时钟使用者应该确保回放的东西跟得上时钟。 一般是要等待一个时间,用gst_clock_id_wait函数,或者丢几帧数据。

参考插件编写指南吧。

5.5 动态修改参数

这个东西不知道是干嘛的。manual上说是在流时间里调整gobject的属性。

必须单独包含gstcontroller库和头文件。

而且还得初始化。

那怎么使用呢?

l         1 先选择需要操作的参数,gst_object_control_properties,得到一个controller对象

l         2 通过该对象,设置插值模式,用来 计算中间态的值。

l         3 最后设置控制点,这是一个时间戳 值,当时间到了,这个值就其激活。

还是不明白有啥用。

5.6 线程

使用队列单元?恩,内部应该就是一个线程安全的队列。

GST通过不同的队列单元,将管道 分为不同的组。

线程调度如何做?有pushpull模式两种。如果单元支持随机seek

寥寥数语,怎么能说清楚呢?

5.7 自动plugging(自动加载插件)

就是想自动完成一些加载插件(生成合适单元)的工作,通过比较匹配视音频格式信息来完 成。

如何匹配?用什么来描述匹配项呢?

1. MIME类型

这个是用来描述媒体信息的。

2. 如何工作

一般来说,一个管道刚开始的时候并不知道一个文件的MIME类型。 所以GST使用类型查找来探测MIME,这个typefinding是管道的一个组成部分,它从文件中读足够的数据直到它能探测为止。

怎么说呢?读一点数据给所有的插件(注册了支持typefind的插 件),如果有哪个插件支持,则加载到管道中。

注意:这里谈的都是自动加载的,如果手动加载的话,应该事先就知道了。

插件如何实现?见manual吧。其实就是调用插件的一个特殊函数,判断是不是自己能支持的。

5.8 管道的高级管理

就是一些对其中传递的buffer进行中途监控的作用,难度相对比较大,等看完插件编写再说。

插件编写更实际点应该,现在看的都是云里雾里。

GST高级接口

6.1 高级播放接口

介绍两个高级点的播放接口,playbindecodebin

支持自动加载,列表播放,淡入淡出音轨等功能。这里不再详述。

6.2 XML

将管道的信息保存到XML,并可以从XML文件中获取管道信息,然后创建管道。

 

附录

7.1 好习惯

l         加入GstBus信息来获取错误等报告

l         检查GST函数返回值

l         解引用任何返回不是GLIB基本类型的对象(就是减少对象的引用计数)

l         用管道对象来管理管道的状态,外部不要自己维护一个状态变量。

7.2 调试

main可以设置-gst-debug=选项,然后传入gst_init中。

7.3 工具

几个工具还是比较有用的。

1 gst-launch

用来测试管道的。

2. gst-insepect

探查单元的各种信息用。

你可能感兴趣的:(职场,休闲,gstreamer)