美文网首页音视频开发笔记
GStreamer 基础教程一 Hello World

GStreamer 基础教程一 Hello World

作者: 老瓦在霸都 | 来源:发表于2024-01-20 09:46 被阅读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
    }
    
    

    总结

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

    • 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()

    相关文章

      网友评论

        本文标题:GStreamer 基础教程一 Hello World

        本文链接:https://www.haomeiwen.com/subject/zdxsodtx.html