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().来开启播放器
  • 回收资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值