新闻  |   论坛  |   博客  |   在线研讨会
骁龙820A汽车 ADAS 分享方案介绍—多媒体处理框架(一)
车载技术工程师 | 2018-06-26 11:39:16    阅读:663   发布文章

在上面的博客中我们介绍了Gst的基本组成,由本篇开始,我们将会分为几个部分来系统介绍Gst的基本概念以及方案简介。

GStreamer基础概念

我们从hello world 开始看一段程序

Hello World!
1.#include <gst/gst.h>
2.
3.int main(int argc, charchar *argv[]) {
4. GstElement *pipeline;
5. GstBus *bus;
6. GstMessage *msg;
7.
8. /* Initialize GStreamer */
9. gst_init (&argc, &argv);
10.
11. /* Build the pipeline */
12. pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm", NULL);
13.
14. /* Start playing */
15. gst_element_set_state (pipeline, GST_STATE_PLAYING);
16.
17. /* Wait until error or EOS */
18. bus = gst_element_get_bus (pipeline);
19. msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
20.
21. /* Free resources */
22. if (msg != NULL)
23. gst_message_unref (msg);
24. gst_object_unref (bus);
25. gst_element_set_state (pipeline, GST_STATE_NULL);
26. gst_object_unref (pipeline);
27. return 0;
28.}
gst_init (&argc, &argv);
这是所有GStreamer应用的第一句,在gst_init里面做了
+初始化所有内部数据结构
+检查所有可用的插件
+运行所有的命令行选项
gst_parse_launch() 
媒体流经过一系列的中间element,从source element流到sink element。这
些相互作用的element构成了一整个的pipeline。在比较简单的情况下,我
们也可以使用gst_parse_launch()来自动搭建一个pipeline。
gst_element_set_state 
这一行代码展示了另一个需要关注的点:状态。每一个
GStreamer的element有一个状态,你可以理解成常见的DVD播放
器上得播放/暂停按钮。播放器必须设置pipeline为PLAYING状态
才能真正开始播放,这一行代码就是做了这件事 。
/* Free resources */
往下就是一些资源的释放工作

基础概念介绍---元件(Elements

• 元件(Element)GStreamer中最重要的概念。
• 可以通过创建一系列的元件,并把它们连接起来,从而让数据流在这个被连接的各个元件之间传输。每个元件都有一个特殊的函数接口,对于有些元件的函数接口它们是用于能够读取文件的数据,解码文件数据的。而有些元件的函数接口只是输出相应的数据到具体的设备上(例如:声卡设备)
• 可以将若干个元件连接在一起,从而创建一个管道(pipeline)来完成一个特殊的任务,例如,媒体播放或者录音。
• 对程序员来说, GStreamer中最重要的一个概念就是GstElement对象。元件是构建一个媒体管道的基本块。每一个元件都对应一个GstElement。任何一个解码器编码器、分离器、视频/音频输出部件实际上都是一个GstElement对象。

元件分类---源元件

源元件为管道产生数据,比如从磁盘或者声卡读取数据。下图是形象化的源元件,我们总是将源衬垫(source pad)画在元件的右端。

blob.png

源元件不接收数据,仅产生数据。你可从上图中明白这一点,因为上图仅有一个源衬垫(右端 )。

元件分类---过滤/类过滤元件

过滤器(Filters)以及类过滤元件(Filter-like elements)都同时拥有输入和输出衬垫。
他们对从输入衬垫得到的数据进行操作,然后将数据ᨀ供给输出衬垫。音量元件
(filter) 、视频转换器(convertor) 、 Ogg分流器或者Vorbis解码器都是这种类型的元
件。
类过滤元件可以拥有任意个的源衬垫或者接收衬垫。
像解码器只有一个源衬垫及一个接收衬垫。而视频分流器可能有一个接收衬垫以
及多个源衬垫,每个接收衬垫对应一种元数据流。

blob.pngblob.png

这个特殊的元件同时拥有源衬垫和接收衬垫。接收输入数据的接收衬垫在元件的左端,源衬垫在右端。

它有多个输出衬垫。 Ogg分流器是个很好的实例。因为Ogg流包含了视频和音频。一个源衬垫可能包含视频元数据流,另一个则包含音频元数据流。

元件分类---接收元件

接收元件是媒体管道的末端,它接收数据但不产生任何数据。写磁盘、利用声卡播放声音以及视频输出等都是由接收元件实现的。下图显示了接收元件。

blob.png

将元件链接起来

• 通过将一个源元件,零个或多个类过滤元件,和一个接收元件链接在一起,你可以建立起一条媒体管道。数据将在这些元件间流过。这是 GStreamer中处理媒体的基本概念。

blob.png

• 把上述过程想象成一个简单的Ogg/Vorbis音频解码器。源元件从磁盘读取文件。第二个元件就是Ogg/Vorbis 音频解码器。最终的接收元件是你的声卡,它用来播放经过解码的音频数据。

注意:在接不同的元件之前,你需要确保些元件都被加在同一个箱柜中,因将一个元件加到一个箱柜中会破坏元件已存在的一些接关系。同,你不能直接接不在同一箱柜或管道中的元件。

元件状态

一个元件在被创建后,它不会执行任何操作。所以你需要改变元件的状态,使得它能够做某些事。Gstreamer中,元件有四种状态,每种状态都有其特定的意义。这四种状态为:
• GST_STATE_NULL: 默认状态。该状态将会回收所有被该元件占用的资源。
• GST_STATE_READY: 准备状态。元件会得到所有所需的全局资源,这些全局资源将被通过该
元件的数据流所使用。
• GST_STATE_PAUSED: 在这种状态下,元件已经对流开始了处理,但此刻暂停了处理。因此
该状态下元件可以修改流的位置信息,读取或者处理流数据,以及一旦状态变为 PLAYING,
流可以重放数据流。这种情况下,时钟是禁止运行的。
• GST_STATE_PLAYING: PLAYING 状态除了当前运行时钟外,其它与 PAUSED 状态一模一样。你可以通过函数gst_element_set_state()来改变一个元件的状态。你如果显式地改变一个元件的态,GStreamer可能会使它在内部经过一些中间状态。例如你将一个元件从 NULL状态设置为 PLAYING状态,GStreamer在其内部会使得元件经历过 READY 以及 PAUSED 状态。 当处于GST_STATE_PLAYING 状态,管道会自动处理数据。它们不需要任何形式的迭代。
状态迁移只能相邻的状态里迁移,也就是说,你不能从NULL一下跳到PLAYING。你必须经过READYPAUSED状态。如果你把pipeline设到PLAYING状态, GStreamer自动会经过中间状态的过渡。

以上就是关于Gst元件的相关概念,我们将会在后面的介绍中来Bins多媒体处理的相关概念。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客