"); //-->
在上面的博客中我们介绍了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)画在元件的右端。
源元件不接收数据,仅产生数据。你可从上图中明白这一点,因为上图仅有一个源衬垫(右端 )。
元件分类---过滤/类过滤元件
过滤器(Filters)以及类过滤元件(Filter-like elements)都同时拥有输入和输出衬垫。
他们对从输入衬垫得到的数据进行操作,然后将数据ᨀ供给输出衬垫。音量元件
(filter) 、视频转换器(convertor) 、 Ogg分流器或者Vorbis解码器都是这种类型的元
件。
类过滤元件可以拥有任意个的源衬垫或者接收衬垫。
像解码器只有一个源衬垫及一个接收衬垫。而视频分流器可能有一个接收衬垫以
及多个源衬垫,每个接收衬垫对应一种元数据流。
这个特殊的元件同时拥有源衬垫和接收衬垫。接收输入数据的接收衬垫在元件的左端,源衬垫在右端。
它有多个输出衬垫。 Ogg分流器是个很好的实例。因为Ogg流包含了视频和音频。一个源衬垫可能包含视频元数据流,另一个则包含音频元数据流。
元件分类---接收元件
接收元件是媒体管道的末端,它接收数据但不产生任何数据。写磁盘、利用声卡播放声音以及视频输出等都是由接收元件实现的。下图显示了接收元件。
将元件链接起来
• 通过将一个源元件,零个或多个类过滤元件,和一个接收元件链接在一起,你可以建立起一条媒体管道。数据将在这些元件间流过。这是 GStreamer中处理媒体的基本概念。
• 把上述过程想象成一个简单的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。你必须经过READY和PAUSED状态。如果你把pipeline设到PLAYING状态, GStreamer自动会经过中间状态的过渡。
以上就是关于Gst元件的相关概念,我们将会在后面的介绍中来Bins多媒体处理的相关概念。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。