使用 GStreamer 進行多用途的多媒體處理(轉)

amyz發表於2007-08-10
使用 GStreamer 進行多用途的多媒體處理(轉)[@more@]

  本文向您介紹 GStreamer,它是一種通用的多媒體處理庫,可以使得多媒體處理更加容易。

  多媒體,依照其定義,表示各種各樣的媒體型別。您可以各種格式儲存音訊、影片和後設資料。然而,這也就意味著要使用許多工具來處理這些不同的內容。

  GStreamer 可以為您提供幫助。透過將所有不同的工具和庫隱藏到它的外掛中,以及使用媒體管道 這個一般性概念,GStreamer 能以一種統一的方式表示對不同型別媒體所進行的操作。這使得您能夠將精力集中於現有的媒體,而不是困惑於究竟應該使用什麼樣的管道。

  這種統一處理方法的優點顯而易見。您可以編寫音樂 或影片 播放器,而不是編寫 MP3 播放器或者 AVI/DivX 播放器。當您希望支援另一種格式時,無需進行深入的研究併為新的庫編寫程式碼。相反,僅需要安裝這種格式的外掛就可以了。就是這麼簡單,甚至不需要進行重新編譯。所有的 GStreamer 應用程式都可以在執行的過程中採用新的格式。

  GStreamer 可以解決許多問題,比如“需要儲存來自不同來源具有相同格式的所有音訊取樣”。因為對所有的格式進行相似的處理,所以您只需要編寫一個工具。這將節省時間,並使得解決方案更加健壯且更易於維護。而且,在您瞭解了 GStreamer 的相關概念之後,幾乎可以將它應用到任何地方。如果您要讓音訊資訊流經網路,那麼只需要考慮這個網路,因為您所使用的音訊 API(應用程式程式設計介面)和所有其他的操作都保持不變。

  相關概念

  由於其本身的特性,GStreamer 比普通的庫位於更高的層次。因此,務必理解 GStreamer 究竟是什麼以及它能夠完成哪些工作。

  GStreamer 是一種媒體處理庫。這就意味著,它為您提供了某種轉換過程的抽象模型(由輸入、輸出和不同的階段組成),並且允許您為滿足特殊的最終結果和特殊的媒體型別而構建這種轉換過程的例項。下面是這種處理過程的一些示例:

  • 將 MP3 音訊檔案轉換為 Ogg Vorbis
  • 播放 AVI 電影檔案
  • 使用 IEEE1394 數字影片 (DV) 攝像機捕獲現場表演,並將它儲存為 MPEG-2 流

  為了實現這些不同的結果,GStreamer 透過抽象的管道概念進行工作。管道 是一個有向圖,媒體在這個有向圖中從輸入流到輸出。管道由各種元素組成,而元素則是另一個核心概念。元素 是可以放入到管道中的物件,其中包裝了對媒體進行的某種操作。您可以將不同的元素連結在一起,以使它們共同組成將輸入轉換為需要的輸出的完整處理過程。通常,使用從左(上游)到右(下游)的資料流來對管道進行描述。使用 gst-launch 以同樣的方式來編寫管道,關於 gst-launch 的內容將在本文後面介紹。

  請務必注意,到目前為止,所有的內容都是完全抽象的。沒有涉及到影片或音訊,之所以這樣做,有一個很好的理由。上面描述的模型並不侷限於任何特定的媒體型別。只要您可以將其描述為輸入、輸出和轉換過程,就都可以利用管道來對其進行操作。例如,桌面可以作為媒體來源,您可以錄製對影片檔案的螢幕播放。事實上,Istanbul 應用程式正是這樣做的(請參見參考資料部分)。

  GStreamer 的核心本身並不包含任何元素。它只提供關於管道的知識。而所有特定的內容,都由相應的外掛提供。外掛 是一段經過編譯的程式碼,通常以物件檔案(UNIX® 上的 .so 和Microsoft® Windows® 上的 .dll)的形式分發,可以提供一個或多個元素。在啟動過程中,GStreamer 對所有已安裝的外掛進行查詢,以獲取可用於應用程式的一組元素。外掛通常可以呼叫其他的庫,以完成特定的任務(例如,MPEG-2 解碼器可以使用現有的庫來處理 MPEG 格式的資訊),但是應用程式並不需要知道這一點。它所看到的只是一些外觀和工作方式相同的元素。

  有些外掛以核心源包的形式分發,並且將其編譯為庫,甚至從概念上看,它們是一些獨立的實體。其他的基本外掛以基於 gst 外掛包的形式分發。在大多數的 GStreamer 安裝中,都包含這些基本外掛。然後還有一些好的、差的和糟糕的 gst 外掛包,其中,根據這些不同的外掛得到的支援級別和許可條款對其進行收集。最後,還有一些由第三方供應商分發或註冊專門用於特定應用程式的外掛。

  融會貫通

  既然已經瞭解了管道,您就還需要了解如何將它對映為 GStreamer 實現。在此過程中,您還將瞭解到更多的術語。

  正如我所提到的,元素是處理過程的基本單元,由 GstElement 類來表示。GStreamer 是使用 C 進行編寫的,但是它使用了來自 GTK+ 工具包的 GObject 庫,以獲得物件導向的特性(請參見參考資料部分)。元素中包含一些單元,這些單元是連結到其他元素的位置。有兩種型別的單元:

  • 接收單元 為元素提供輸入。
  • 可以透過源單元 訪問元素所產生的資料。

  這些單元所具有的相應功能稱為能力。這些功能表示什麼型別的資料可以流經該單元。例如,如果您檢查一個 vorbisdec 元素(它是一個免費 Vorbis 程式碼的解碼器),可以看到如清單 1 中所示的程式碼。一行開頭處的美元符號 ($) 表示該行是常規的 UNIX Shell 命令。

  清單 1. vorbisdec 元素資訊中的程式碼段

  $ gst-inspect-0.10 vorbisdec

[...]

Pad Templates:

 SRC template: 'src'

  Availability: Always

  Capabilities:

   audio/x-raw-float

          rate: [ 8000, 50000 ]

        channels: [ 1, 6 ]

       endianness: 1234

         width: 32

 SINK template: 'sink'

  Availability: Always

  Capabilities:

   audio/x-vorbis

[...]

  您可以看到,其中有兩種單元模板:一種用於源 (src),另一種用於接收器。源單元的可用性為 always(其他可能的可用性取值為 sometimes 和 request),並且能夠以 8kHz 到 50kHz 的速率輸出原始浮點音訊,該音訊具有 1 至 6 聲道、小端位元組順序以及 32 位寬的取樣。另一方面,接收單元僅接收 Vorbis 編碼的音訊流。

  要使管道正常工作,這些模板是至關重要的。當您試圖將兩個元素連結到一起以組成一個管道時,GStreamer 會檢視它們的單元模板是否相容。這個過程稱為協商。在協商過程中,這些元素會嘗試發現它們之間共同支援的最佳格式。如果不存在這樣的格式,那麼連結將會失敗。否則,它們將會達成協議使用一種通用格式。這種格式不再是模板,而稱為固定的能力,這表示所有的值都具有實際意義並且是明確的。然後,可以將資料從一個元素傳遞到另一個元素。

  現在,您已經瞭解了開始工作前所需要的內容。為了完成具體的工作,我將介紹 GStreamer 中如“瑞士軍刀”般銳利的工具,gst-launch 工具。

  使用 gst-launch

  gst-launch 是您所碰到用途最多的工具之一。對於 GStreamer 來說,它就像是 UNIX 的 Shell。使用該工具,您甚至可以透過特殊的語法(相應地稱為 gst-launch 語法)構建複製的管道,如清單 2 中所示。

  清單 2. gst-launch 行的示例

  $ gst-launch-0.10 filesrc location=

 "concept.mp3" ! decodebin ! alsasink

Setting pipeline to PAUSED ...

Pipeline is PREROLLING ...

Pipeline is PREROLLED ...

Setting pipeline to PLAYING ...

New clock: audioclock0

  清單 2 是一種最簡單的音訊播放器。現在,我正使用它聽 concept.mp3。表 1 解釋瞭如何從左到右閱讀該命令列。

  表 1. 清單 2 中介紹的語法的元素描述

  元素描述

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-941663/,如需轉載,請註明出處,否則將追究法律責任。

相關文章