GStreamer功能详解

参考:https://blog.csdn.net/tx3344/article/details/7497434

参考:https://thebigdoc.readthedocs.io/en/latest/gstreamer/gst-concept.html

什么是GStreamer?

GStreamer 是一个 基于pipeline的多媒体框架,基于GObject,以C语言写成。

应用GStreamer这个这个多媒体框架,你可以写出任意一种流媒体的应用来如:meidaplayer、音视频编辑器、VOIP、流媒体服务器、音视频编码等等。

什么是pipeline?

pipeline是GStreamer设计的核心思想,在说pipeline之前先弄一个meidaplayer的模型,meidaplayer是GStreamer比较重要的应用之一。不管是VLC、mplayer这些开源的多媒体播放器,还是其他商用的。meidaplayer都能抽象成以下的模型:

上面这个图就是个典型的meida播放器的模型:

  • source:数据来源,可能是file、http、rtp等.
  • demux: 负责把容器里的音视频数据剥离出来,然后分别送给audio\video  decoder.
  • decoder:解码,然后把解完后的数据(yuv、pcm)送给audio\video output输出.
  • output:负责将decoder过来的数据呈现出来.

如果把数据想象成流水的话,每个模块的功能虽然不同,但是他们大致抽象的功能都是接收上个模块过来的数据,然后加工把加工后的数据送到下一个模块。把上述这些模块通过某种方式连接起来,就形成了一个流水线(pipeline),这个流水线就是一个media播放器。

GStreamer 就是把每个模块都看做是一个Element,然后构建了连接和操作这些Element的方法,用户可以通过自己的需求把不同的Elements 排列组合,形成一个又一个的不同的pipeline。你可以形成具有mediaplayer功能的pipeline 、VOIP功能的pipeline。

例如:

gst-launch-1.0 filesrc location=越单纯越幸福.mp3 ! decodebin ! audioconvert ! alsasink

运行这条命令你就可以听到动听的音乐了,当然前提是你的当前目录有这个音乐文件。

gst-launch-1.0 可以用来运行 GStreamer 管道,你只需要将需要使用的元素一个一个 传递给它就可以了,每一个命令使用 ! 来连接。此处你可以把 ! 当作命令行里 的 | ,!左边的命令的输出传递给其右边的命令作为输入。上面那条命令包含了几个元素,我们简单解释一下: a. filesrc——这个元素从本地磁盘加载了一个文件,使用该元素时你设置了 location 属性指向了音乐文件,关于属性我们后边聊。 b. decodebin——我们需要从 filesrc 解码,因此我们使用了这个元素。这个元素是一个聪明的小家伙,它会自动检测文件的类型并在后台构造一些GStreamer元素来解码。因此, 此处对于 mp3 你可以使用 mad 代替之试一下。 c. audioconvert——一个声音文件中有各种各样的信息,每种信息传递到喇叭都是不同的, 因此要使用此元素来做一下转换。 d. alsasink——这个元素做的事很简单,就是把你的音频使用ALSA传递给你的声卡。

文章写到这里,我们就可以使用管道来做各种试验了,但首先我们要知道有那些元素可以使用

$ gst-inspect-1.0

这个命令列出了可用的元素,你也可以使用该命令查看某一元素的详细信息,例如 filesrc 元素:

$ gst-inspect-1.0 filesrc

GStreamer架构

这个时候再看 Gstreamer整体的架构图就很清楚了,

底层是150多个plugin,也就是Element.提供不同功能的元件:

  • protocols handling
  • sources: for audio and video (involves protocol plugins)
  • formats: parsers, formaters, muxers, demuxers, metadata, subtitles
  • codecs: coders and decoders
  • filters: converters, mixers, effects, ...
  • sinks: for audio and video (involves protocol plugins)

中间的core framework提供:插件框架、pipeline架构、媒体类型处理机制、等等,也就是上面说的处理Elements的方式方法.

上层依靠Gstreamer提供的这些方式方法还有plugin,构建出自己的不同类型的多媒体应用。

相关术语

元素element

其实我们已经讨论了管道,而元素就在管道上。每一个元素都有很多属性用来设置该元素。 例如, volume 元素(设置管道的音量)有一个熟悉 volume 可以设置音量或者静音。 当你创建自己的管道时就要给很多的元素设置属性。

pad

每一个元素都有虚拟的插头供数据流入和流出,即pad。如果你把元素看作一个对输入的 数据做一些处理的黑盒。在盒子的左右两边就是插孔了,你可以插入电缆向盒子传入信息, 这就是pad要做的事。绝大多数元素有一个输入pad(叫做sink)和一个输出pad(叫做src)。 因此,我们上面的管道看起来是这样的:

[src] ! [sink src] ! [sink src] ! [sink]

最左边的元素只有一个src pad用来提供信息(如filesrc)。接下来的几个元素接收信息并 做一些处理,因此他们有sink和src pad(例如decodebin和audiocovert),最后一个元素 只接收信息(例如alsasink)。当你使用 gst-inspect-1.0 命令查看一个元素的详细信息时,就会列出该元素的pad信息。

注意可能与平时大家认为的概念有些不同的是,src pad是用来发送数据的端点,即数据的输出端;而sink pad是用来接收数据的端点,即数据的输入端。

cap

我们已经了解了pad和从管道第一个元素到最后一个元素的数据流是怎么回事了,那么我们 来讨论下 cap 。每一个元素都有特定的cap,cap是指该元素可以接收什么样的信息( 例如是接收音频还是视频)。你可以把cap看成是电源插座上其可以接受什么范围电压的规则。

bin

很多人不理解bin,其实它很简单。bin就是一种便捷的方式,可以把很多个元素放进一个 容器中。例如你有很多个元素用来解码视频并对其使用一些效果。要使事情变得简单一些, 你可以把这些元素放进一个bin(就像一个容器)中,以后你就可以使用bin来引用这些元素了。 这样其实bin变成了一个元素,例如你的管道是 a ! b ! c ! d ,你可以把他们放进 mybin,这样当你使用mybin时其实是引用了 a ! b ! c ! d 。

ghost pad

当你创建了一个bin并在里面放置了很多元素时,该bin变成了你自定义的元素,该元素按 顺序调用里面的元素。要做到这样,你的bin很自然地需要它自己的pad,它自己的pad会挂接 到bin里面元素的pad上,这就是 ghost pad 了。当你创建一个bin时,你创建了ghost pad 并告诉他们要去挂接里面哪一个元素。

猜你喜欢

转载自blog.csdn.net/zong596568821xp/article/details/81705406