Buffers and Events(缓冲区和事件)
流经管道的数据由缓冲区和事件的组合组成。缓冲区包含实际的媒体数据。事件包含控制信息,例如查找信息和流结束通知器。所有这些都将在管道运行时自动流经管道。本章主要是向您解释这个概念;您不需要为此做任何事情。
Buffers
缓冲区包含将流经您创建的管道的数据。源元素通常会创建一个新缓冲区,并通过pad将其传递到链中的下一个元素。当使用GStreamer基础架构创建媒体管道时,您不必自己处理缓冲区;元素会为您做这件事。
除其他外,缓冲区包括:
-
指向内存对象的指针。内存对象封装了内存中的一个区域。
-
缓冲区的时间戳。
-
指示有多少元素正在使用此缓冲区的重新计数。当没有元素引用缓冲区时,此重新计数将用于销毁缓冲区。
-
缓冲区标志。
简单的例子是创建一个缓冲区,分配内存,放入数据,并传递给下一个元素。该元素读取数据,做一些事情(比如创建一个新缓冲区并解码到其中),并取消引用缓冲区。这会导致数据被释放,缓冲区被销毁。典型的视频或音频解码器是这样工作的。
不过,还有更复杂的场景。元素可以就地修改缓冲区,即不分配新的缓冲区。元素还可以写入硬件内存(例如来自视频捕获源)或从X服务器分配的内存(使用XShm)。缓冲区可以是只读的,等等。
Events
事件是控制信息,与缓冲区一起在管道中向上和向下发送。向下传递事件通知流状态的其他元素。可能的事件包括查找、刷新、流结束通知等。向上传递事件既用于应用程序-元素交互,也用于元素-元素交互,以请求流状态的更改,例如查找。对于应用程序,只有向上传递事件是重要的。向下传递事件只是为了更完整地了解数据概念而解释的。
由于大多数应用程序以时间单位寻道,我们下面的示例也这样做:
static void
seek_to_time (GstElement *element,
guint64 time_ns)
{
GstEvent *event;
event = gst_event_new_seek (1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_NONE,
GST_SEEK_METHOD_SET, time_ns,
GST_SEEK_TYPE_NONE, G_GUINT64_CONSTANT (0));
gst_element_send_event (element, event);
}
函数gst_element_seek ()
是一个快捷方式 主要是为了展示这一切是如何运作的。