GStreamer笔记 -- 1.Hello world
因为项目需要,要用到deepstream,然后deepstream又是基于GStreamer库写的,因此学习一下GSreamer,尝试了一下,认为如果是只关注应用层,重点不在于编解码的话,GStreamer是最好的选择,如果要做视频编解码的话ffmpeg是个不错的选择,现在做个Gstreamer笔记,主要参考官网教程
更多信息参见GStreamer官网,对于Gstreamer的概念参见这篇帖子
https://www.ibm.com/developerworks/cn/linux/l-gstreamer/
我觉得官网教程很好,第一个例子就用几行代码就展示了个播放器,我们就从第一个Hello World
开始
1.目标
我们在学习任何一门语言的时候,没有什么能比在屏幕上打印一行Hello World
更能给人留下深刻的印象了。但是GStreamer是一个视频结构库,因此我们用实现一个简单的视频播放器来代替,你可以建立一个c文件,名字basic-tutorial-1.c,但是有你喜欢,什么名字都可以
#include <gst/gst.h>
int
main (int argc, char *argv[])
{
GstElement *pipeline;
GstBus *bus;
GstMessage *msg;
/* Initialize GStreamer */
gst_init (&argc, &argv);
/* Build the pipeline */
pipeline =
gst_parse_launch
("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",
NULL);
/* Start playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);
/* Wait until error or EOS */
bus = gst_element_get_bus (pipeline);
msg =
gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
/* Free resources */
if (msg != NULL)
gst_message_unref (msg);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
}
这里只记录在linux上的实现,编译以上c文件命令为
gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`
然后执行可执行文件,就可以看到一个视频播放窗口,前提是你的电脑连到网络
./basic-tutorial-1
2.代码讲解
我们先看这行代码
/* Initialize GStreamer */
gst_init (&argc, &argv);
在使用Gstreamer的时候第一行代码必须是它,这个代码做的使用如下
- 初始化内部所有结构体
- 检查所有可用的插件
- Executes any command-line option intended for GStreamer
这行代码需要连个参数argc, argv
/* Build the pipeline */
pipeline =
gst_parse_launch
("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",
NULL);
上面这行代码是这个例子的核心部分,要注意两个关键点:gst_parse_launch 和 playbin
gst_parse_launch
Gstreamer 是用于处理多媒体视频流的框架,媒体从source elements
开始(数据生产者),到sink elements
结束(消费数据) ,通过中间一系列元素来处理各种任务,这一些列链接的元素组成的结合成为管道pipline
.
在GStreamer 中,一般手动链接各种元素来构建管道,但是在管道很简单的时候,并且管道不需要任何高级特性,你可以走个捷径,gst_parse_launch()。
这个函数接受一个管道的文本描述,并把它转换为一个实际的管道,这个函数非常有用
playbin
那么,我们希望gst_parse_launch给我们创建要给什么样的管道呢?这就是第二个关键点:我们创建的管道只有一个element 叫做playbin
playbin是一个特殊的element,他扮演这source和sink的角色。即使数据生产者,又是数据的消费者,构成要给完整的管道
在这个历程中,playbin 的参数可以是本地文件,file://
;也可以是网络视频流http://,也可以是rtsp地址
gst_element_set_state
/* Start playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);
该函数这只管道的状态,这里设置管道为运行状态
获取管道ERROR
/* Wait until error or EOS */
bus = gst_element_get_bus (pipeline);
msg =
gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
该代码柱塞等待管道的中的error或者视频流的结束。
Cleanup
在整个管道结束后,需要做一些结尾工作,回收资源
/* Free resources */
if (msg != NULL)
gst_message_unref (msg);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
总结
通过该教程,可以学到GStreamer框架的一下内容
- 怎么使用 gst_init() 来初始化GStreamer
- 怎么使用 gst_parse_launch()函数通过管道文本描述来搭建一个管道
- 怎么使用 playbin来搭建一个简单的视频播放器
- 怎么使用gst_element_set_state().来开启播放器
- 回收资源