GStreamer 基础教程一: Hello World

Posted on Thu 18 January 2024 in Journal

Abstract GStreamer 基础教程一: Hello World
Authors Walter Fan
 Category    learning note  
Status v1.0
Updated 2024-01-18
License CC-BY-NC-ND 4.0

-- 老范编译自 GStreamer 官方教程

GStreamer 是如此著名的多媒体框架,它的管道和插件模式令人印象深刻,眼界大开,原来管道模式可以玩得这么精妙。

目标

熟悉使用任何一种新的开发软件语言或者软件代码库的方法,最莫过于在屏幕上打印 "Hello world".

而对于多媒体框架来说,播放一段视频比 hello world 更合适于快速上手。

下面代码远多于一个标准的 Hello world, 不过多数是初始化和清理代码,真正起作用的也就四行代码。

废话不多说,还是看代码吧。

程序流程

flow

@startuml

start
:初始化 gst_init;
:构建管道 gst_gst_parse_launch;
:开始播放 gst_element_set_state;
:等待结束 gst_bus_timed_pop_filtered;
:释放资源 gst_object_unref ...;
stop

@enduml

源代码

#include <gst/gst.h>

#ifdef __APPLE__
#include <TargetConditionals.h>
#endif

int
tutorial_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://gstreamer.freedesktop.org/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;
}

int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
  return gst_macos_main (tutorial_main, argc, argv, NULL);
#else
  return tutorial_main (argc, argv);
#endif
}

总结

由此,我们可以知道下面几个问题的答案了。

  • Q. 如何初始化 GStreamer 使用 gst_init

  • Q. 如何根据文本描述快速构建管道

使用 gst_parse_launch

  • Q. 如何创建一个自动播放的管道

使用 playbin

  • Q. 如何告诉 GStreamer 开始播放

使用 gst_element_set_state()

  • Q. 如何等着瞧 Gstreamer 来搞定每一件事

使用 gst_element_get_bus() 和 gst_bus_timed_pop_filtered()


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。