gstreamer教程(2)——gstreamer设计原则
设计原则:
GStreamer 提供了一个干净的接口:
-
应用程序程序员:给想要构建媒体处理流(media pipeline)的应用程序程序员。可以使用一组广泛的强大工具来创建媒体处理流(media pipeline),而无需编写任何代码。执行复杂的媒体操作变得非常容易。
- 插件程序员:为插件程序员提供了一个简洁明了的 API 来创建自包含的插件。集成了广泛的调试和跟踪机制。GStreamer 还附带了一组广泛的真实插件作为示例。
面向对象:
GStreamer 遵循 GLib 2.0
对象模型 GObject
。熟悉 GLib 2.0
或 GTK+
的程序员会熟悉 GStreamer。
GStreamer 使用信号和对象属性的机制。
所有对象都可以在运行时查询其各种属性和功能。
GStreamer 打算在编程方法上与 GTK+
相似。这适用于对象模型、对象的所有权、引用计数等。
扩展:
所有 GStreamer 对象都可以使用 GObject
继承方法进行扩展。
所有插件都是动态加载的,可以独立扩展和升级。
允许仅限二进制的插件:
插件是在运行时加载的共享库。由于插件的所有属性都可以使用 GObject
属性进行设置,因此无需(实际上也没有办法)为插件安装任何头文件。
我们特别注意使插件完全自包含。插件的所有相关方面都可以在运行时查询。
高性能:
通过以下方式获得高性能:
- 使用 GLib 的
GSlice
分配器 - 插件之间的极轻量级链接。数据可以以最小的开销在管道中传输。典型管道里插件之间的数据传递仅需要指针的间接引用。
- 提供一种直接作用于目标内存的机制。例如,插件可以直接写入 X 服务器的共享内存空间。缓冲区还可以指向任意内存,例如声卡的内部硬件缓冲区。
- 引用技术 和 写时拷贝 最大限度地减少了 memcpy 的使用。Sub-buffer 可以有效地将 buffer 拆分为可管理的部分。
- 专用的流式处理线程,其调度由内核处理。
- 允许使用专用插件进行硬件加速。
- 使用具有插件规格的插件注册表,以便可以使插件延迟到实际使用再加载。
清理核心/插件分离:
GStreamer 的核心本质上是与媒体无关的。它只知道字节和块,并且只包含基本元素。GStreamer 的核心甚至具有足够的功能来实现低级系统工具,如 cp。
所有媒体处理功能都由核心外部的插件提供。这些告诉核心如何处理特定类型的媒体。
为编解码器实验提供框架:
GStreamer 还希望成为一个简单的框架,编解码器开发人员可以在其中试验不同的算法,从而加快开放和自由多媒体编解码器的开发,例如由 Xiph.Org Foundation 开发的编解码器(例如 Theora 和 Vorbis)。