openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))

1)概述

管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号。所有这些数据流在运行的时候自动的流过管道。

2) 缓冲区(Buffers)

缓冲区包含了你创建的管道里的数据流。通常一个source element会创建一个新的缓冲区,同时element还将会把缓冲区的数据传递给下一个element。当使用GStreamer底层构造来创建一个媒体管道的时候,你不需要自己来处理缓冲区,element将会为你处理这些缓冲区。

一个缓冲区主要由以下一个组成:

指向某块内存的指针

内存的大小

缓冲区的时间戳

一个引用计数,指出了缓冲区所使用的element数。没有element可引用的时候,这个element将用于销毁缓冲区。

这里有一个简单的例子,我们先创建了一个缓冲区,然后为这个缓冲区分配内存,然后将数据存放在缓冲区中,并传递至下一个element。该element读取数据,处理某些事件(像创建一个新的缓冲区并进行解码),对该缓冲区解引用,这将造成数据空闲,导致缓冲区被销毁。典型的音频和视频解码器就是这样工作的。

尽管如此,还有一些更为复杂的设定,element会适当的修改缓冲区,也就是说,不会分配一个新的缓冲区。element也可以写入硬件内存(如视频捕获源)或是使用XShm从X-server分配内存。缓冲区只能读,等等。

3)事件(Events)

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

由于大多数应用程序以时间为单位查找,下面的例子实现了同样的功能:

static void  seek_to_time (GstElement *element,     guint64     time_ns)

{

     GstEvent *event;

     event = gst_event_new_seek (GST_SEEK_METHOD_SET |  GST_FORMAT_TIME,   time_ns);

     gst_element_send_event (element, event);

}

以上代码主要是说明其具体的工作原理,快捷算法是一个函数 gst_element_seek ()。

posted @ 2015-06-09 20:35  夕相待  阅读(2923)  评论(0编辑  收藏  举报