Gstreamer 应用开发:Basic tutorial 1 Hello world!

29 篇文章 8 订阅
19 篇文章 29 订阅

Goal

没有什么比在屏幕上打印“Hello World”更能获得对软件库的第一印象了!

但由于我们正在处理多媒体框架,我们将播放视频。 不要被下面的代码数量吓到:只有 4 行可以做真正的工作。 剩下的就是清理代码,而且,在 C 语言中,这总是有点冗长。

事不宜迟,为您的第一个 GStreamer 应用程序做好准备……

Hello world完整样例

// 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);
​
  /* See next tutorial for proper error message handling/parsing */
  if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
    g_error ("An error occurred! Re-run with the GST_DEBUG=*:WARN environment "
        "variable set for more details.");
  }
​
  /* Free resources */
  gst_message_unref (msg);
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  return 0;
}

编译:

gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`

测试:

一开始直接跑是会报错:

** (basic-tutorial-1:21750): ERROR **: 16:34:37.803: An error occurred! Re-run with the GST_DEBUG=*:WARN environment variable set for more details.

 是因为playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm 显然这个URL你是链接不到的,所以需要换成一个你可以具体链接播放的链接。

我自己有一个RTSP服务器,所以我就更改了URL

  /* Build the pipeline */
  pipeline =
      gst_parse_launch
      ("playbin uri=rtsp://127.0.0.1:8554/test",
      NULL);

重新编译后就可以正常执行,播放你链接中的视频。 

细节分解

让我们回顾一下这些代码行,看看它们做了什么:

/* Initialize GStreamer */
  gst_init (&argc, &argv);

这必须始终是您的第一个 GStreamer 命令gst_init()

  • 初始化所有内部结构

  • 检查哪些插件可用

  • 执行任何用于 GStreamer 的命令行选项

如果您总是将命令行参数 argc 和 argv 传递给 gst_init(),您的应用程序将自动受益于 GStreamer 标准命令行选项(更多信息请参阅基础教程 10:GStreamer 工具) .

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 是一个设计用于处理多媒体流的框架。 媒体从“源”元素(生产者)传播到“汇”元素(消费者),经过一系列执行各种任务的中间元素。 所有互连元素的集合称为“管道”。

        在 GStreamer 中,您通常通过手动组装各个元素来构建管道,但是,当管道足够简单并且您不需要任何高级功能时,您可以使用捷径:gst_parse_launch()

        此函数采用管道的文本表示并将其转换为实际管道,这非常方便。 事实上,这个函数非常方便,有一个完全围绕它构建的工具,您会非常熟悉(参见基础教程 10:GStreamer 工具以了解 gst-launch-1.0gst-launch-1.0 语法)。

playbin

        那么,我们要求 gst_parse_launch() 为我们构建什么样的管道? 这里进入第二个关键点:我们正在构建一个由单个元素组成的管道,称为playbin

  playbin 是一个特殊的元素,它充当源和接收器,是一个完整的管道。 在内部,它创建并连接播放媒体所需的所有元素,因此您不必担心。

        它不允许手动管道所具有的控制粒度,但它仍然允许足够的定制来满足各种应用程序的需要。 包括本教程。

        在本例中,我们只向playbin 传递了一个参数,即我们要播放的媒体的 URI。 尝试将其更改为其他内容! 无论是 http:// 还是 file:// URI,playbin都会透明地实例化相应的 GStreamer 源!

        如果您输入错误的 URI,或者文件不存在,或者您缺少插件,GStreamer 提供了几种通知机制,但我们在此示例中所做的唯一事情是出错时退出,因此不要期望太多反馈。

/* Start playing */
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

        这条线突出了另一个有趣的概念:状态。 每个 GStreamer 元素都有一个关联的状态,您或多或少可以将其视为普通 DVD 播放器中的播放/暂停按钮。 现在,只要将管道设置为 PLAYING 状态,播放就不会开始。

        在这一行中,gst_element_set_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);

        这些行将一直等到发生错误或找到流的结尾。 gst_element_get_bus() 检索管道的总线,并且 gst_bus_timed_pop_filtered() 将阻塞,直到您通过该总线收到 ERROREOS(End-Of-Stream)。 这条线不用太担心,GStreamer 总线在基础教程 2:GStreamer 概念中进行了解释。

        就是这样! 从此时起,GStreamer 负责一切。 当媒体到达终点 (EOS) 或遇到错误(尝试关闭视频窗口,或拔下网线)时,执行将结束。 始终可以通过在控制台中按 control-C 来停止应用程序。

清理

        但是,在终止应用程序之前,我们需要做一些事情来正确地整理好我们自己。

/* See next tutorial for proper error message handling/parsing */
  if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
    g_error ("An error occurred! Re-run with the GST_DEBUG=*:WARN environment "
        "variable set for more details.");
  }

始终阅读您使用的函数的文档,以了解在使用后返回的对象是否应该释放它们。

        在这种情况下,gst_bus_timed_pop_filtered() 返回了一条需要使用 gst_message_unref() 释放的消息(更多关于基本教程 2:GStreamer 概念中的消息)。

  gst_element_get_bus() 添加了对必须使用 gst_object_unref() 释放的总线的引用。 将管道设置为 NULL 状态将确保它释放它已分配的任何资源(更多关于基础教程 3:动态管道中的状态)。 最后,取消引用管道将破坏它,以及它的所有内容。

总结

至此,您的第一个 GStreamer 教程结束。 我们希望它的简洁性可以作为这个框架多么强大的一个例子!

让我们回顾一下。 今天我们学到了:

  • 如何使用 gst_init() 初始化 GStreamer。

  • 如何使用 gst_parse_launch() 从文本描述中快速构建管道。

  • 如何使用 playbin 创建自动播放管道。

  • 如何使用 gst_element_set_state() 向 GStreamer 发出信号以开始播放。

  • 如何高枕无忧,而 GStreamer 使用 gst_element_get_bus()gst_bus_timed_pop_filtered() 处理所有事情。

文章链接:GStreamer基础教程(一) - 知乎

英文版本:Basic tutorial 1: Hello world!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值