音视频开发笔记

GStreamer 基础教程一 Hello World

2024-01-20  本文已影响0人  老瓦在霸都

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

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

目标

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

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

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

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

程序流程


@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
}

总结

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

使用 gst_parse_launch

使用 playbin

使用 gst_element_set_state()

使用 gst_element_get_bus() 和 gst_bus_timed_pop_filtered()

上一篇下一篇

猜你喜欢

热点阅读