Gstreamer官方教程彙總1---Hello World

這個教程是創建在已經安裝並配置好gstreamer sdk的基礎上的,若是沒有安裝好gstreamer sdk,請參看:html

http://docs.gstreamer.com/display/GstSDK/Installing+the+SDK
web


代碼及操做示例

將下面代碼copy到一個命名爲basic-tutorial-1.c的文件中。shell

#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 ("playbin2 uri=http://docs.gstreamer.com/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;
}


在終端輸入:
框架

gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-0.10`

正常會生成basic-tutorial-1這樣一個可執行文件,但若是提示沒有gst/gst.h文件,則須要先安裝好執行環境:函數

sudo yum install gstreamer-devel


執行:
工具

./basic-tutorial-1

就能夠看到效果了。
ui


逐步解說

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

  • 初始化全部的內部結構spa

  • 檢查插件是否可用插件

  • 執行用於gstreamer的命令參數設計


/* Build the pipeline */
pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm", NULL);

這行代碼是教程的核心,有兩點須要說明:gst_parse_launch() 和 playbin2

gst_parse_launch

GStreamer是設計用來處理多媒體流的框架。從「source」元素(生產者),下至「sink」要素(消費者)媒體傳播,經過一系列執行各類任務的中間元素。該集合中的全部相互鏈接的元件被稱爲「pipeline(管道)」。

GStreamer中你一般是由手工組裝的各個元素打造的管道,可是,當管道是很容易的,你不須要任何先進的功能,你能夠把快捷方式:gst_parse_launch()

這個函數接受一個管道的文本表示並把它變成一個實際的管道,這是很是方便的。事實上,這個功能是如此駕輕就熟它周圍有徹底創建了一個工具,你會獲得很是熟悉(請參Basic tutorial 10: GStreamer tools來了解gst-launchgst-launch語法)。

playbin2

那麼,什麼樣的管道是咱們要求gst_parse_launch()來構建咱們呢?下面進入第二個關鍵點:咱們正在創建一個名爲playbin2單一元素組成的管道

playbin2是充當sourcesink一個特殊的元素(element),而且可以實現整個管道。在內部,它建立並鏈接全部必要的元素來播放媒體,因此你沒必要擔憂它。

它不容許元操做,像一個手動管道能作到的,可是,它仍然容許足夠普遍的支持本身定製應用。包括本教程。

在這個例子中,咱們只傳遞一個參數來playbin2,這是咱們要播放的媒體的URI。試着將其更改到別的東西!不管是http://或file :/ / URI,playbin2將實例化適當的GStreamer source

若是您輸入了錯誤的URI,或者該文件不存在,或者你缺乏一個插件,GStreamer中提供了多種通知機制,可是咱們正在作的這個例子中,惟一一件事就是退出的錯誤,因此不要期望多的反饋。


/* Start playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);

這條線突出了另外一個有趣的概念:狀態。 GStreamer的每個元素(element)都有一個相關聯的狀態(state),您能夠或多或少認爲的播放/暫停按鈕,在您的普通DVD播放機。如今,我只想說,除非你設置的管道爲i播放狀態,不然不會開始播放。

在這一行,gst_element_set_state()是設置管道(咱們的惟一元素,記不清了)爲播放狀態,從而開始播放。


/* Wait until error or EOS */
bus = gst_element_get_bus (pipeline);
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()將阻塞,直到您收到錯誤或EOS(End-Of-Stream)。 GStreamer的概念:不要過多地擔憂這條線,GStreamer的總線在Basic tutorial 2: GStreamer concepts解釋。

就是這樣!從這時開始,GStreamer包辦一切事情。當媒體到達終點(EOS),或遇到錯誤(請嘗試關閉視頻窗口,或拔掉網線),則執行將結束。該應用程序能夠經過按Ctrl-C組合在控制檯中中止。


Cleanup

/* 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()返回一個message須要被釋放,關於gst_message_unref()(更多請參看Basic tutorial 2: GStreamer concepts);

gst_element_get_bus()添加一個引用到必須用gst_object_unref()釋放的總線。設置pipeline設空將確保它釋放已分配的資源(更多Basic tutorial 3: Dynamic pipelines)。最後,unreferencing管道會破壞它,和它的全部內容。


Conclusion

讓咱們回顧一下,今天所學的:


接下來的教程將不斷推出更多的GStreamer的基本元素,並告訴你如何手工建立一個管道。

很高興你能閱讀這篇教程,並從中學到些許東西,下面的教程咱們再見。

相關文章
相關標籤/搜索