GStreamer学习笔记(二)--HelloWold程序代码走读

源码

#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;
}

代码走读

首先include了<gst/gst.h>,该头文件包含了GStreamer的对外api

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

首先调用的是gst_init(),它的作用是:

  • 初始化所有内部结构
  • 检查哪些插件是能够获取的
  • 执行传递给GStreamer的命令行选项
/* Build the pipeline */
pipeline =
    gst_parse_launch
    ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",
    NULL);

这一行是这个sample的核心,主要有两个关键:gst_parse_launch和playbin

gst_parse_launch

GStreamer是一个设计用来处理多媒体流的框架。媒体从“source” “element”(生产者)到“sink” :“element”(消费者),经过一系列执行各种任务的中间elements。所有相互连接的elements的集合称为“pipeline”。
在GStreamer中,您通常通过手动组装各个element来构建pipeline,但是,当pipeline足够简单并且您不需要任何高级特性时,您可以采用快捷方式:gst_parse_launch()。
这个函数接受pipeline的文本表示,并将其转换为实际的pipeline,这非常方便

playbin

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

playbin是一个特殊的元素,它既是source又是sink,是一个完整的pipeline。在内部,它创建并连接播放媒体所需的所有必要element,因此您不必担心它。

它不允许手动pipeline的控制粒度,但是,它仍然允许足够的自定义,以满足广泛的应用程序。包括本教程。

在本例中,我们只向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()将阻塞,直到您通过该总线接收到ERROR或EOS (end - stream)。

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

/* 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()释放的消息

Gst_element_get_bus()为必须使用gst_object_unref()释放的总线添加了一个引用。将管道设置为NULL状态将确保它释放已分配的任何资源最后,取消对管道的引用将破坏管道及其所有内容。

总结

我们学会了:

  • 使用gst_init初始化GStreamer
  • 通过gst_parse_launch()以文本描述的方式快速构建一个pipeline
  • 使用playbin创建一个自动播放的pipeline
  • 使用gst_element_set_state()通知GStreamer开始播放
  • 让GStreamer负责一切,使用gst_element_get_bus()和gst_bus_timed_pop_filtered()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这段代码是在Docker容器中执行的一系列命令,用于安装一些软件包和依赖项。具体来说,它执行以下操作: 1. `apt-get clean`:清理apt-get缓存,以释放磁盘空间。 2. `apt-get update`:更新apt-get软件包列表。 3. `apt-get install -y`:安装以下软件包和依赖项: - `python3`:Python 3的主要二进制文件。 - `python3-pip`:Python 3的包管理工具pip。 - `libopencv-dev`:OpenCV开发库的头文件和静态库。 - `python3-opencv`:Python 3的OpenCV绑定。 - `build-essential`:构建软件包所需的基本工具和编译器。 - `yasm`:视频编解码器的汇编器。 - `cmake`:跨平台的构建工具。 - `libtool`:通用库支持脚本工具。 - `libc6`、`libc6-dev`:C标准库的运行时库和开发文件。 - `unzip`:解压缩工具。 - `wget`:网络下载工具。 - `libnuma1`、`libnuma-dev`:NUMA(非统一内存访问)系统的库和开发文件。 - `libgstreamer1.0-0`:GStreamer多媒体框架的核心库。 - `gstreamer1.0-plugins-base`、`gstreamer1.0-plugins-good`、`gstreamer1.0-plugins-bad`、`gstreamer1.0-plugins-ugly`、`gstreamer1.0-libav`:GStreamer插件和解码器。 - `gstreamer1.0-doc`、`gstreamer1.0-tools`、`gstreamer1.0-x`、`gstreamer1.0-alsa`、`gstreamer1.0-gl`、`gstreamer1.0-gtk3`、`gstreamer1.0-qt5`、`gstreamer1.0-pulseaudio`:GStreamer的文档、工具和相关库。 - `libglib2.0-dev`:GLib开发库的头文件。 - `libgstrtspserver-1.0-dev`:GStreamer RTSP服务器库的开发文件。 - `gstreamer1.0-rtsp`:GStreamer的RTSP插件。 这些操作旨在为容器配置一个适合开发的环境,使其能够支持Python编程、OpenCV图像处理和GStreamer多媒体处理等任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最佳打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值