【GStreamer開發】GStreamer基礎教程06——媒體格式和pad的Capabilities

來源:互聯網
上載者:User
目標
      Pad的Capabilities是一個GStreamer element的基礎,因為framework大部分時間是自動處理的,所以我們幾乎感覺不到它的存在。本教程比較偏向原理,介紹了:
      什麼是Pad Capabilities
      如何獲得這個東西
      什麼時候應該去獲得這個東西
      為什麼你需要瞭解他們

介紹
Pads
      Pads允許資訊進入或者離開一個element——就像曾經展示過得一樣。這個Capabilities(或者簡單地叫做Caps)就是指定哪些資訊可以通過Pad來傳輸。例如:“”RGB視頻,尺寸為320x200並且每秒30幀“或者”16位的音頻採樣,5.1聲道,每秒採樣44.1k“甚至可以是類似於mp3/h264之類的壓縮格式。
      Pads支援多重Capabilities(比如,一個視頻的sink可以支援RGB輸出或者YUV輸出),Capabilities可以指定一個範圍而不必須是一個特定值(比如,一個音頻sink可以支援從1~48000的採樣率)。然而,資料從一個pad流向另一個pad的時候,必須是一個雙方都能支援的格式。某一種資料形式是兩個pad都能支援的,這樣Pads的Capabilities就固定下來(只有一個鐘個數,並且不再是一個資料區間了),這個過程被稱為協商。下面的例子會更清楚的說明這一點。
      為了兩個element可以串連,他們必須有一個共同的Capabilities子集(否則它們肯定不能互相串連)。這就是Capabilities存在的主要目的。
      作為一個應用開發人員,我們通常都是用串連一個個element的方法來建立pipeline的。在這個例子中,你需要瞭解你使用的element的Pad的Caps。
Pad模板
      Pad是由Pad模板建立的,模板裡面會列出一個Pad所有可能的Capabilities。模板對於建立幾個相似的Pad是很有協助的,但也會比較早就判斷出兩個element是否可以相連:如果連兩個Pad的模板都不具備共同的子集的化,就沒必要進行更深層的協商了。
      Pad模板檢查是協商流程的第一步。隨著流程的逐步深入,Pad會正式初始化,也會確定他們的Capability(除非協商失敗了)。

Capabilities例子

[plain] view plain copy   SINK template: 'sink'     Availability: Always     Capabilities:       audio/x-raw-int                  signed: true                   width: 16                   depth: 16                    rate: [ 1, 2147483647 ]                channels: [ 1, 2 ]       audio/x-raw-int                  signed: false                   width: 8                   depth: 8                    rate: [ 1, 2147483647 ]                channels: [ 1, 2 ]         這是一個element的永久sink pad。它支援2種媒體格式,都是音訊未經處理資料(audio/x-raw-int),16位的符號數和8位的無符號數。方括弧表示一個範圍,例如,頻道(channels)的範圍是1到2.

[plain] view plain copy   SRC template: 'src'     Availability: Always     Capabilities:       video/x-raw-yuv                   width: [ 1, 2147483647 ]                  height: [ 1, 2147483647 ]               framerate: [ 0/1, 2147483647/1 ]                  format: { I420, NV12, NV21, YV12, YUY2, Y42B, Y444, YUV9, YVU9, Y41B, Y800, Y8  , GREY, Y16 , UYVY, YVYU, IYU1, v308, AYUV, A420 }          video/x-raw-yur表示這個source pad用YUV格式輸出視頻。它支援一個很廣的維數和幀率,一系列的YUV格式(用花括弧列出了)。所有這些格式都顯示不同的映像打包和子採樣程度。

最後的總結 

      你可以使用gst-inspect-0.10這個工具(在後面教程中會介紹)來查看一下element的Caps。

      記住有些element會查看底層的硬體來確定支援的格式和能提供的Pad的Caps(通常在進入READY或更後面的狀態)。因此,這個顯示的Caps由於平台的不同是不一樣的,甚至可能在每一次運行都不相同(這種情況很少)。

      本教程會建立2個element,顯示它們各自的Pad模板,串連起來並把pipeline設定成PLAY狀態。在每個狀態切換的過程中,sink element的Pad的Capabilities會顯示出來,這樣你就可以觀察到協商過程是如何進行的,最後Pad的Caps是怎麼定下來的。


一個簡單地Pad Capabilities例子

[objc] view plain copy   #include <gst/gst.h>        /* Functions below print the Capabilities in a human-friendly format */   static gboolean print_field (GQuark field, const GValue * value, gpointer pfx) {     gchar *str = gst_value_serialize (value);          g_print ("%s  %15s: %s\n", (gchar *) pfx, g_quark_to_string (field), str);     g_free (str);     return TRUE;   }        static void print_caps (const GstCaps * caps, const gchar * pfx) {     guint i;          g_return_if_fail (caps != 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.