GStreamer 基礎(chǔ)教程一 Hello World

-- 老范編譯自 GStreamer 官方教程

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

目標

熟悉使用任何一種新的開發(fā)軟件語言或者軟件代碼庫的方法,最莫過于在屏幕上打印 "Hello world".

而對于多媒體框架來說,播放一段視頻比 hello world 更合適于快速上手。

下面代碼遠多于一個標準的 Hello world, 不過多數(shù)是初始化和清理代碼,真正起作用的也就四行代碼。

廢話不多說,還是看代碼吧。

程序流程


@startuml

start
:初始化 gst_init;
:構(gòu)建管道 gst_gst_parse_launch;
:開始播放 gst_element_set_state;
:等待結(jié)束 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
}

總結(jié)

由此,我們可以知道下面幾個問題的答案了。

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

  • Q. 如何根據(jù)文本描述快速構(gòu)建管道

使用 gst_parse_launch

  • Q. 如何創(chuàng)建一個自動播放的管道

使用 playbin

  • Q. 如何告訴 GStreamer 開始播放

使用 gst_element_set_state()

  • Q. 如何等著瞧 Gstreamer 來搞定每一件事

使用 gst_element_get_bus() 和 gst_bus_timed_pop_filtered()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • GStreamer 是一個用于構(gòu)建媒體處理組件圖(也可以稱為 pipeline,或管道)的庫。它支持的應(yīng)用非常廣泛...
    hanpfei閱讀 3,315評論 0 0
  • 基礎(chǔ)教程 這些教程描述了了解教程其它部分需求的基礎(chǔ)內(nèi)容。 子頁面 教程一 Hello world! | 必備的"H...
    lava_liu閱讀 281評論 1 2
  • 前言 Angular相比于原生js有什么優(yōu)勢? 什么是單頁面應(yīng)用(SPA)呢? 優(yōu)勢:項目架構(gòu)很清晰代碼的復(fù)用性強...
    mm_tang閱讀 1,651評論 0 1
  • C++是一種通用編程語言。 C++可以創(chuàng)建計算機程序。從應(yīng)用程序,音樂播放器,甚至視頻游戲它都可以勝任。 C ++...
    代碼人生ll閱讀 12,888評論 0 1
  • 前面我們熟悉了shell腳本的一些基礎(chǔ)語法,現(xiàn)在我們繼續(xù)深入。 Shell管道 語法結(jié)構(gòu) 命令1 | 命令2 |....
    JunnpyZ閱讀 700評論 0 0

友情鏈接更多精彩內(nèi)容