基于GStreamer的视频框架-02-GStreamer介绍
What is GStreamer
GStreamer的基本设计来自美国俄勒冈大学研究生院的视频管道(video pipeline)研究,是一个用于创建流媒体应用的框架。GStreamer的处理对象主要是音频和视频数据,但是不局限于音视频,而是可以处理任何数据流。管道的设计使得GStreamer具有较小的开销和延迟,组件插件化的设计使得各种音视频处理组件可以混合并匹配到任意管道中,开发音频和视频处理应用,为数据流创建管道变得非常简单
GStreamer提供以下内容
- 为多媒体开发提供一组API
- 插件架构
- 管道架构
- 媒体类型的处理/协商机制
- 同步机制
- 提供超过250个官方插件,1000多个elements
- 工具集合
图中显示了GStreamer的大部分内容,最上层是应用程序层面,开发人员可以利用GStreamer构建例如媒体播放器、VoIP、推流服务器、视频编辑器等多媒体应用程序,GStreamer也为开发人员提供了几个命令行工具。中间的GStreamer核心框架层包括了管道架构、媒介限制、基础类、消息总线、媒体类型协商、插件系统、数据传输、同步。最下层是GStreamer插件,包括了GStreamer官方提供的插件和第三方插件
设计准则
GStreamer基于以下几个设计准则
- Clean and powerfull
- 应用程序开发,可以非常方便的执行复杂的媒体操作
- 插件开发,提供简洁的API创建插件,提供调试和跟踪机制
- Object oriented
- GStreamer Object基于GObject,使用GLib实现面向对象的设计
- 使用信号和对象属性,可查询/设置对象的属性和能力
- Extensible
- 所有 Object 都以 GObject 为基类
- 插件动态加载,可以独立更新和扩展
- Allow binary‑only plugins
- 插件的所有属性都是通过 GObject 进行设置
- 插件都是运行时加载的共享库
- High performance
- 使用 GLib GSlice allocator,内存性能高
- 管道数据传输开销小,数据传递只涉及指针取消引用
- 直接内存访问,可直接访问硬件缓冲区
- 重新计数和写时复制最大限度地减少 memcpy 的使用
- 专用流线程
- 硬件加速插件
- 使用插件注册表,插件在实际使用时才真正加载
几个重要的概念
Elements
Element是GStreamer中最重要的概念,是构成管道的数据处理节点,将多个elements链接起来就构成了管道,数据会流经管道。不同的element具有特定的功能,例如从文件读取数据、数据格式转换、编解码视频、输出到设备等。GStreamer提供的大量插件就是以element的形式提供给开发人员,开发人员只需要在程序中通过插件的名称来引入element就可以进行连接和使用。用户也可以自己开发自己的element,纳入到数据管道中
Pads
Pads是element的输入和输出,用于element之间的连接和协商数据流。pad具有特定的数据处理能力,可以限制流经它的数据类型,只有两个pad数据类型相匹配时,才允许连接。pad 只允许数据的单向流通,数据从element流出的pad叫做source pad,从pad进入到element的叫做sink pad。element可以具有多个source pads和多个sink pads只有source pad的element叫做source element
Bins and pipelines
bin是多个元素的容器,bin是element的子类,可以像操作element一样操作bin,可以用于抽象 pipeline的复杂性。可以通过改变bin的状态来改变其内部elment的状态。可以透传总线的各种消息到内部elements。pipeline是最顶层的bin,为应用程序提供消息总线,并管理子节点的同步。当设置 pipeline为播放状态时,会启动数据流,pipeline将会在一个独立的线程中运行。VPI视频框架的内部实现就是充分运用了bin作为容器的原理
一个利用GStreamer构建的pipeline如下图所示,其中有6个elements,file-source是一个src element,只有src pad,只产生数据,file-source的src pad连接到ogg-demuxer的sink pad。ogg-demuxer是一个音视频分离器,它输出端有src0和src1两个pads,用于音视频进行分流。src0连接到vorbis-decoder的sink pad上,用于进行音频解码,然后vorbis-decoder的src pad连接到audio-sink的sink pad上,用于将解码后的音频数据通过音频播放器播放出来。另一路视频数据连接到theora-decoder的sink pad,用于进行视频解码,theora-decoder的src pad连接到video-sink上,用于进行视频的显示