科普分享 | GStreamer是什么?

1,084 阅读5分钟

背景 file 从历史的角度来看,Linux 在多媒体方面已经远远落后于其它的操作系统。微软的Windows和苹果的MacOS它们对多媒体设备、多媒体创作、播放和实时处理等方面已经有了很好的支持。另一方面,Linux对多媒体应用的综合贡献比较少,这也使得Linux很难在专业级别的软件上与Windows和MacOS去竞争。GStreamer正是为解决Linux多媒体方面当前问题而设计的。

GStreamer是什么? GStramer是一个创建流媒体应用程序的框架。GStreamer的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。GStreamer并不受限于音频和视频处理它能够处理任意类型的数据流。管道设计的方法对于实际应用的滤波器几乎没有负荷,它甚至可以用来设计出对延时有很高要求的高端音视频应用程序。

GStreamer最显著的用途是在构建一个播放器上, GStreamer已经支持很多格式的档了,包括: MP3、Ogg/Vorbis. MPEG-12、 AVI、 Quickime、 mod等等。从这个角度看, GStreamer更像是一个播放器。但是它主要的优点却是在于它的可插入组件能够很方便的接入到任意的管道当中。

GStreamer框架是基于插件的,有些插件中提供了各种各样的多媒体数字信号编译码器,也有些提供了其它的功能。所有的插件都能够被链接到任意的已经定义了的数据流管道中。

GStreamer框架的应用的简单分层: file

Media Applications

最上面一层为应用,比如GStreamer自带的一些工具(gst-launch,gst-inspect等),以及基于GStreamer封装的库(gst-player,gst-rtsp-server,gst-editing-services等)根据不同场景实现的应用。

Core Framework 中间一层为Core Framework,主要提供:

  1. 上层应用所需接口

  2. Plugin的框架

  3. Pipline的框架

  4. 数据在各个Element间的传输及处理机制

  5. 多个媒体流(Streaming)间的同步(比如音视频同步)

  6. 其他各种所需的工具库

Plugins 最下层为各种插件,实现具体的数据处理及音视频输出,应用不需要关注插件的细节,会由Core Framework层负责插件的加载及管理。主要分类为:

1、Protocols:负责各种协议的处理,file,http,rtsp等。

2、Sources:负责数据源的处理,alsa,v4l2,tcp/udp等。

3、Formats:负责媒体容器的处理,avi,mp4,ogg等。

4、Codecs:负责媒体的编解码,mp3,vorbis等。

5、Filters:负责媒体流的处理,converters,mixers,effects等。

6、Sinks:负责媒体流输出到指定设备或目的地,alsa,xvideo,tcp/udp等。

7、GStreamer框架根据各个模块的成熟度以及所使用的开源协议,将core及plugins置于不同的源码包中:

GStreamer: 包含core framework及core elements。

gst-plugins-base: GStreamer应用所需的必要插件。

gst-plugins-good: 高质量的采用LGPL授权的插件。

gst-plugins-ugly: 高质量,但使用了GPL等其他授权方式的库的插件,比如使用GPL的x264,x265。

gst-plugins-bad: 质量有待提高的插件,成熟后可以移到good插件列表中。

gst-libav: 对libav封装,使其能在GStreamer框架中使用。

GStreamer的优点

  1. 结构清晰且威力强大:我们可以使用一系列强有利的工具来创建媒体管道,而不用去写一行代码,从而使得复杂的媒体控制变得非常简单。GStreamer 向插件提供了简洁而简单的API来创建self- plugin(自包含)插件,同时还集成了大量的调试和跟踪机制和工具。GStreamer也提供了一系列现实例子。

  2. 灵活的可扩展性能:所有的GStreamer对象都可以采用GObject继承的方法进行扩展。所有的插件都可以被动态装载。

  3. 高性能主要体现在:使用GLib的g_ mem_ chunk和非模块化分配算法使得内存分配尽可能最小。插件之间的连接非常轻型(light-weight).数据在管道中的传递使用最小的消耗,管道中插件之间的数据传递只会涉及指针废弃。提供了一套对目标内存直接进行操作的机制。例如,插件可以向X server共享的内存空间直接写数据,缓冲区也可以指向任意的内存,如声卡的内部硬件缓冲区。refcounting和写拷贝将memcpy减少到最低。子缓冲区有效地将缓冲区分离为易于管理的块。使用线程联合(cothreads)减少线程消耗。线程联合(cothreads)是简单又高速的方法来切换子程序,作为衡量最低消耗600个cpu周期的标准。使用特殊的插件从而支持硬件加速。采用带有说明的插件注册,这样的话只在实际需要使用该插件才会去装载。所有的判断数据都不用互斥锁。

下一期我们会进一步学习GStreamer

  • End -

技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。 阿木实验室致力于前沿IT科技的教育和智能装备,让机器人研发更高效!