GStreamer-1.0的使用--基础教程(1):Hello world! C语言


前言

本文根据GStreamer官方文档书写,用于学习和备忘。

提示:以下是本篇文章正文内容,下面案例可供参考

一、本节目标

对一个软件库而言,没有什么比能在屏幕上打印出“Hello World”更好的第一印象了!
但由于我们使用的是多媒体框架,我们将播放视频。
不要被下面的代码数量吓到:只有4行代码真正起作用。剩下的是清理代码,在C语言中,这总是有点冗长。
准备好您的第一个GStreamer应用程序……

二、Hello World

将此代码复制到一个名为basic-tutorial-1.c的文本文件中(或者在您安装的GStreamer示例中找到它)。
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上安装、在Mac OS X上安装或在Windows上安装教程所述进行编译。如果出现编译错误,请仔细检查这些部分给出的说明。
如果一切都构建良好,启动可执行文件!你应该会看到一个弹出的窗口,里面有直接从互联网上播放的视频和音频。恭喜你!

Need help?
如果你需要帮助来编译这段代码,请参考为你的平台构建教程部分:Linux, Mac OS XWindows,或者在Linux上使用这个特定的命令:

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

如果您需要帮助来运行此代码,请参考针对您的平台运行教程部分:LinuxMac OS XWindows

必需的库:gstreamer - 1.0

本教程将打开一个窗口并显示一个带有音频的电影。
音频是从互联网获取的,所以窗口可能需要几秒钟才能出现,这取决于你的网速。此外,没有延迟管理(缓冲),所以在慢速连接上,电影可能会在几秒钟后停止。所以在慢速连接时,电影可能会在几秒钟后停止。看看Basic tutorial 12: Streaming(基础教程12;流)是如何解决这个问题的。


三、程序通读

让我们回顾一下这几行代码,看看它们是做什么的:

1、gst_init ()

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

这必须始终是您的第一个GStreamer命令。其中,gst_init():

  1. 初始化所有内部结构
  2. 检查可用的插件
  3. 执行任何用于GStreamer的命令行选项

如果你总是将命令行参数argc和argv传递给gst_init(),你的应用程序将自动从GStreamer标准命令行选项中受益(更多相关内容见 Basic tutorial 10: GStreamer tools)

2、gst_parse_launch()和playbin

  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()”element,经过一系列执行各种任务的中间elements。所有相互连接的元件(elements)的集合称为“管道(pipeline)”。
在GStreamer中,你通常通过手工组装单个元element来构建管道,但是,当管道足够简单,而且你不需要任何高级功能时,你可以采用捷径:gst_parse_launch().
这个函数接受pipeline的文本表示,并将其转换为实际的管道,这非常方便。事实上,这个函数非常方便,有一个完全围绕它构建的工具,您将非常熟悉(请参阅基础教程10:GStreamer工具,了解gst-launch-1.0gst-launch-1.0语法)。

playbin

那么,我们要求gst_parse_launch()为我们构建什么样的管道呢?这里是第二个重点::我们正在构建一个由一个名为playbin的element组成的管道。
Playbin是一个特殊的element,它既是source也是sink,自己又是一个完整的管道。在内部,它创建并连接所有必要的elements来播放你的音频,所以你不必担心它。
它没有手工组成的管道所具有的控制精细度,但是它仍然允许足够的定制以满足广泛的应用程序。包括本教程。
在这个例子中,我们只向playbin传递了一个参数,这是我们想要播放的媒体的URI。试着把它改成别的东西!无论是http://还是file:// URI, playbin都会正确地将GStreamer源代码实例化!
如果输入错误的URI,或者文件不存在,或者缺少插件,GStreamer提供了几种通知机制,但是我们在本例中所做的唯一一件事就是在错误时退出,所以不要期望得到太多反馈。

3、gst_element_set_state ()

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

这一行代码强调了另一个有趣的概念:state(状态)。每个GStreamer中的element都有一个相应的状态,可以比喻为普通DVD播放机中的播放/暂停状态。现在,只有当你将管道状态设置为PLAYING 时,音频回放才会开始。
在这一行中,gst_element_set_state()将pipeline(我们唯一的element,记住)设置为PLAYING状态,从而启动音频回放。

4、gst_element_get_bus ()和gst_bus_timed_pop_filtered ()

  /* 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);

这些代码指令将一直等待,直到程序运行发生错误或找到流(stream)的末尾。gst_element_get_bus()检索管道的总线。并且gst_bus_timed_pop_filtered()为阻塞(block)状态,直到你通过该总线接收到一个ERROR或者一个EOS (end - stream)才会导通。不要太担心这一行指令,GStreamer总线在基础教程2:GStreamer概念中有解释。
这就是这段代码的作用。从现在开始,GStreamer将负责一切。当音频到达它的音频流结尾(EOS)或遇到错误时(尝试关闭视频窗口或拔下网络电缆),执行将结束。通过在控制台中按control+C,应用程序总是可以停止。

5、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);

一定要阅读所使用函数的文档,以了解在使用它们之后是否应该释放它们返回的对象。
在本例中,gst_bus_timed_pop_filtered()返回了一个需要通过gst_message_unref()来释放的message(关于message的更多信息见基础教程2:GStreamer概念)
Gst_element_get_bus()添加了对总线的占用,该占用必须通过gst_object_unref()释放。将管道设置为NULL状态将确保它释放已分配的任何资源(关于state的更多信息,请参见基础教程3:动态管道)。最后,取消对管道的引用将销毁它和它的所有内容。

四、总结

GStreamer的第一个教程到此结束。我们希望它的简短可以作为这个框架多么强大的一个例子!
让我们回顾一下。今天我们学到:

  1. 如何使用gst_init()初始化GStreamer
  2. 如何使用gst_parse_launch()从文本描述快速构建管道。
  3. 如何使用playbin element创建一个自动播放管道。
  4. 如何使用gst_element_set_state()通知GStreamer开始播放。
  5. 如何使用GStreamer使用gst_element_get_bus()和gst_bus_timed_pop_filtered()来获取总线状态。
    下一篇教程将继续介绍更多基础的GStreamer元素,并向您展示如何手动构建管道。
    很高兴你在这里,期待再次见面!
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值