参考:https://blog.csdn.net/tx3344/article/details/7497434
参考:https://thebigdoc.readthedocs.io/en/latest/gstreamer/gst-concept.html
参考:https://blog.csdn.net/sdjhs/article/details/51444934
什么是GStreamer?
GStreamer 是一个 基于pipeline的多媒体框架,基于GObject,以C语言写成。
应用GStreamer这个这个多媒体框架,你可以写出任意一种流媒体的应用来如:mediaplayer、音视频编辑器、VOIP、流媒体服务器、音视频编码等等。
什么是pipeline?
pipeline是GStreamer设计的核心思想,在说pipeline之前先弄一个mediaplayer的模型,mediaplayer是GStreamer比较重要的应用之一。不管是VLC、mplayer这些开源的多媒体播放器,还是其他商用的。mediaplayer都能抽象成以下的模型:
上面这个图就是个典型的media播放器的模型:
- 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 并告诉他们要去挂接里面哪一个元素。