天天看點

openwrt gstreamer執行個體學習筆記(三.深入了解gstreamer 的 Element)

在前面的部分,我們簡要介紹過 GstElementFactory 可以用來建立一個element的執行個體,但是GstElementFactory不僅僅隻能做這件事,GstElementFactory作為在 GStreamer 注冊系統中的一個基本類型,它可以描述所有的插件(plugins)以及由GStreamer建立的element。這意味着GstElementFactory可以應用于一些自動element執行個體, 像自動插件(autopluggers); 或者建立一個可用element清單,像管道對應用程式的類似操作(像GStreamer Editor) 。

1.通過GstElementFactory得到element的資訊

像gst-inspect 這樣的工具可以給出一個element的概要: 插件(plugin)的作者、描述性的element名稱(或者簡稱)、element的等級(rank)以及element的類别(category)。類别可以用來得到一個element的類型,這個類型是在使用GstElementFactory建立該element時做建立的。例如類别可以是 Codec/Decoder/Video(視訊解碼器)、Source/Video(視訊發生器)、Sink/Video(視訊輸出器)。音頻也有類似的類别。同樣還存在 Codec/Demuxer和Codec/Muxer,甚至更多的類别。Gst-inspect将會列出目前所有的Factory對象,gst-inspect <factory-name> 将會列出特定Factory對象的所有概要資訊。

将會列出特定factory對象的所有概要資訊。

#include <gst/gst.h>

int main (int   argc,  char *argv[])

{

  GstElementFactory *factory;

  /* init GStreamer */

  gst_init (&argc, &argv);

  /* get factory */

  factory = gst_element_factory_find ("audioconvert");

  if (!factory) {

    g_print ("You don't have the 'audioconvert' element installed!

");

    return -1;

  }

  /* display information */

  g_print ("The '%s' element is a member of the category %s.

"

           "Description: %s

",

           gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)),

           gst_element_factory_get_klass (factory),

           gst_element_factory_get_description (factory));

  return 0;

}

2.找出element所包含的pads

GstElementFactory最有用處的功能可能是它包含了對element所能産生的pads的一個較長的描述,以及這些pads的功能(以行外話講: 就是指這些pads所支援的媒體類型),而得到 這些資訊是不需要将所有的插件(plugins)都裝載到記憶體中。這可用來給一個編碼器提供一個編碼清單,或在多媒體播放器自動加載插件時發揮作用。目前 所有基于 GStreamer 的多媒體播放器以及自動加載器(autoplugger)都是以上述方式工作。

3.連結element

通過将一個source element,零個或多個like filter element,和一個recv element連結在一起,你可以建立起一條媒體管道。資料将在這些element間流過。這是 GStreamer 中處理媒體的基本概念。

通過連結這三個element,我們建立了一條簡單的element鍊。element鍊中source element("element1")的輸出将會是like filter element ("element2")的輸入。like filter element将會對資料進行某些操作,然後将資料輸出給最終的recv element("element3")。

4.element狀态

一個element在被建立後,它不會執行任何操作。是以你需要改變element的狀态,使得它能夠做某些事情。 Gstreamer中,元件有四種狀态,每種狀态都有其特定的意義。這四種狀态為:

1) GST_STATE_NULL: 預設狀态。該狀态将會回收所有被該element占用的資源。

2) GST_STATE_READY: 準備狀态。element會得到所有所需的全局資源,這些全局資源将被通過該element的資料流所使用。例如打開裝置、配置設定緩存等。但在這種狀态下,資料流仍未開始被處 理,是以資料流的位置資訊應該自動置0。如果資料流先前被打開過,它應該被關閉,并且其位置資訊、特性資訊應該被重新置為初始狀态。

3) GT_STATE_PAUSED: 在這種狀态下,element已經對流開始了處理,但此刻暫停了處理。是以該狀态下element可以修改流的位置資訊,讀取或者處理流資料,以及一旦狀态變為 PLAYING,流可以重放資料流。這種情況下,時鐘是禁止運作的。總之, PAUSED 狀态除了不能運作時鐘外,其它與 PLAYING 狀态一模一樣。處于 PAUSED 狀态的element會很快變換到 PLAYING 狀态。舉例來說,視訊或音頻輸出element會等待資料的到來,并将它們壓入隊列。一旦狀态改變,element就會處理接收到的資料。同樣,視訊接收element能夠播放資料的第 一幀。(因為這并不會影響時鐘)。自動加載器(Autopluggers)可以對已經加載進管道的插件進行這種狀态轉換。其它更多的像codecs或者 filters這種element不需要在這個狀态上做任何事情。

4) GT_STATE_PLAYING: PLAYING 狀态除了目前運作時鐘外,其它與 PAUSED 狀态一模一樣。你可以通過函數gst_element_set_state()來改變一個element的狀态。你如果顯式地改變一個element的狀态,GStreamer可能會 使它在内部經過一些中間狀态。例如你将一個element從 NULL 狀态設定為 PLAYING 狀态,GStreamer在其内部會使得element經曆過 READY 以及 PAUSED 狀态。

當處于GST_STATE_PLAYING 狀态,管道會自動處理資料。它們不需要任何形式的疊代。 GStreamer 會開啟一個新的線程來處理資料。GStreamer 同樣可以使用 GstBus在管道線程和應用程式現成間互動資訊