999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于GStreamer的媒體播放研究

2012-07-13 03:05:58劉衛東王金童
電子設計工程 2012年3期
關鍵詞:多媒體

王 蕊 , 劉衛東 ,2, 王金童

(1.中國海洋大學 信息科學與工程學院,山東 青島 266100;2.海信電器股份有限公司 山東 青島 266071;3.青島海信信芯科技有限公司 山東 青島 266071)

如今多媒體系統的功能越來越復雜,并且由于不同的多媒體系統之間的硬件平臺和軟件平臺存在著巨大的差異性,這些都給多媒體系統的移植工作帶來了問題。為了將多媒體系統移植到不同的軟、硬件平臺上,必須為這些平臺重新編寫多媒體處理代碼,并且在應用程序開發時,要花很大的時間和精力對這些底層多媒體處理重新進行整合。但是如果這些多媒體系統中加入了多媒體框架GStreamer,那么就可以把復雜的底層多媒體處理的整合工作交給多媒體框架來處理。借助于GStreamer的管道機制,插件(編解碼器,復用/解復用器,控制器等)中的各種多媒體處理代碼對于上層的應用程序而言變得透明,在開發應用程序時就不需要把精力和注意力放在底層代碼的整合工作上。與此同時,被封裝成共享庫的插件中的元件可以被多個應用程序共享使用,減少了重復代碼的編寫,簡化了集成和復用,提高了開發的效率。

1 GStreamer簡介和工作原理

1.1 GStreamer簡介

GStreamer是一個功能強大的開源多媒體應用程序框架,它的基本設計思想來自于俄勒岡(Oregon)研究生院有關視頻管道的創意,同時也借鑒了DirectShow的設計思想。

GStreamer作為Gnome桌面環境推薦的多媒體應用框架,采用了基于插件的模塊化設計,框架中所有功能模塊都被實現成可以插拔的組件,并且在需要的時候能夠很方便地安裝到任意一個管道上,所有插件都通過管道機制進行統一的數據交換。GStreamer在構建播放器上有顯著的用途,附帶200多個音視頻處理插件,能夠支持多種格式的文件,包括MP3、 Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、mod 等等。

GStreamer核心庫是一個處理插件、數據流和媒體操作的框架,為程序員編寫應用程序提供了一些公用的API。

GStreamer有以下3個基本概念[1-6]:

1)元件(Element) 元件是GStreamer中最重要的概念,它是組成管道的基本構件,也是框架中所有可用組件的基礎。按照各自功能上的差異,GStreamer的元件可以分為3類:①數據源元件 Source Element,只有輸出端,它僅能用來產生供管道處理的數據,而本身不對數據做任何處理。比如從磁盤或者聲卡讀取數據。②過濾器元件 Filter Element,既有輸入端又有輸出端,它從輸入端獲得相應的數據,并在經過特殊處理之后傳遞給輸出端。比如格式轉換,編解碼等。③Sink Element接收器元件,只有輸入端,它僅具有消費數據的能力,是整條媒體管道的終端。比如聲卡播放聲音以及視頻輸出等。

2)箱柜(Bin)和管道(Pipeline) 箱柜是一個可以裝載元件的容器。管道是箱柜的一個特殊的子類型,管道可以操作包含在它自身內部的所有元件。因為箱柜本身又是元件的子集,所以能夠像操作普通元件一樣的操作一個箱柜,可以通過改變一個箱柜的狀態來改變箱柜內部所有元件的狀態。管道是一個高級的箱柜。當設定管道為播放狀態的時候,數據流將開始流動,并且媒體數據也開始進行處理,一旦開始,管道將在一個單獨的線程中運行,直到被停止或者數據流播放完畢。頂層箱柜必須為一個管道,因此每個GStreamer應用程序都至少需要一個管道。

3)襯墊(Pad) 襯墊在GStreamer中被用于多個元件的鏈接,從而讓數據流能在這樣的鏈接中流動。 一個襯墊可以被看作是一個元件插座或者端口,元件之間的鏈接就是依靠著襯墊。一個襯墊能夠限制數據流類型的通過,只有在兩個襯墊允許通過的數據類型一致的時候元件之間的鏈接才能被建立。

1.2 工作原理

GStreamer通過抽象的管道概念進行工作。管道是一個有向圖,數據流在這個有向圖中從輸入流到輸出。管道由各種元件構成,而元件則是可以放入到管道中的對象,其中包裝了對媒體進行的某種操作。在管道中不同的元件可以通過襯墊鏈接在一起,共同組成將輸入轉換為需要的輸出的完整處理過程。通常,使用從左(上游)到右(下游)的數據流來對管道進行描述。所以,管道的工作過程可以簡單的描述為對數據流進行輸入、轉換和輸出的過程。基本的GStreamer應用工作原理如圖1所示。

圖1 GStreamer工作原理Fig.1 Operation principle of GStreamer

在GStreamer應用中,框架中的大部分API都會涉及到對元件的操作,元件通過襯墊與外界進行交互,向框架中的其余部分表明自己的特性或者功能,開發者可以通過特定的函數來設置元件的屬性。襯墊根據是在元件的輸入端還是輸出端 , 分為 輸出襯墊(Src pad)和 輸入襯墊(Sink pad)。管道在箱柜之上,通過它控制媒體播放中的各種狀態,包括插放、暫停、快進、快退等。總線[1](Bus)在箱柜之上,主要用來裝入回調函數,傳遞一些管道運行后的消息。每個管道都默認有一個總線,不需要手工創建,只要設置消息處理器(Handler)到總線上,管道運行起來后,等待消息被捕捉到,就會立刻調用回調函數。

2 GStreamer庫的安裝

為了實現GStreamer的一般應用,需要安裝的模塊包括:gstreamer、gst-plugins-base、gst-plugins-good、gst-pluginsugly、gst-plugins-bad、gst-ffmpeg。 版本分別選擇其對應的最新版本。從GStreamer官方網站的下載頁面分別下載到本地硬盤,解壓之后在終端中分別輸入命令./configure、make、make install按照順序逐個配置、編譯、安裝各個模塊,最終完成GStreamer的安裝。

GStreamer-0.10[3]的組成模塊及其最新版本如表1所示。

表1 GStreamer-0.10組成模塊版本Tab.1 Version of GStreamer-0.10’s composition modules

3 GStreamer應用

3.1 播放管道設計

利用GStreamer的插件構建的媒體播放管道構建圖[5]如圖2所示。其中,Source element用來讀取媒體文件,并連接到Demuxer element,由它負責把媒體文件里的壓縮音視頻數據分離出來,之后分別連接到音頻解碼元件Audio decoder element和視頻解碼元件Video decoder element分別對分離出來的音視頻進行解碼,然后再分別連接到音頻輸出元件Audio sink element和視頻解碼元件Video sink element完成媒體流的輸出。

在整體管道構造中,使用到一些重要的GStreamer API[6]函數,來實現初始化庫,創建元件,連接元件,設置元件屬性等。以下為具體設計管道的主要步驟:

1)gst_init(),通過 gst_init()函數來初始化 GStreamer庫,確保程序包含了 gst/gst.h頭文件,這樣GStreamer庫中的對象和函數才能夠被正確地定義。

2)g_main_loop_new (), 創建一個主循環, 在執行g_main_loop_run()后正式開始循環。

3)gst_pipeline_new(),創建一條新的管道,用來容納和管理元件。

4)gst_element_factory_make(),根據元件 Factory 中的類型創建元件,包括輸入源元件source,過濾器元件decoder和接收器元件sink。

5)g_object_set()[4],指定輸入文件的路徑。

6)gst_bin_add()和 gst_element_link()將新創建的元件添加到已創建的管道中,通過襯墊鏈接管道中的元件(元件要按照順序鏈接)。

圖2 媒體播放管道構建圖Fig.2 Media-player pipeline

程序用gst_bin_add_many()函數將創建的所有元件都加入管道pipeline中,然后用gst_element_link_many()來連接他們,這樣各個元件就可以配合工作了。

7)gst_pipeline_get_bus()和 gst_bus_add_watch(),從管道中得到總線,創建一個消息處理器來偵聽管道。每當管道發出一個消息到總線,這個消息處理器就會被觸發,它調用回調函數來處理消息。

8)gst_element_set_state(),設置管道的運行狀態。狀態可以設 置 為 GST_STATE_NULL,GST_STATE_READY,GST_STATE_PAUSED和GST_STATE_PLAYING,對應于初始化、準備、暫停和播放狀態。

9)g_main_loop_run(),讓主循環運行起來,開始碼流的播放。

10)gst_object_unref(),播放完成后,釋放系統資源。

3.2 獲取媒體文件信息

通常當加載一個新的媒體流時,媒體的類型并不明了,所以在選擇一條管道來對媒體流進行解碼之前,首先需要檢測媒體流的類型。在 GStreamer中使用了類型檢測插件typefind[1]來達到此目的。在上層提出音頻播放請求時,通過插件typefind分析音頻文件的格式,若為不支持的格式,向上層發送一個無法播放的消息;若為支持的格式,及時動態地調用插件生成對應的插件,并連接封裝成一個管道進行播放處理。

成功獲取文件信息后,GStreamerBus會發出消息,并按照函數g_signal_connect()的設置,調用回調函數cb_typefound();

在函數cb_typefound()成功獲取文件信息后,調用cb_typefound()時,會返回一個GstCaps數據,其中包含了諸如文件類型,寬度,高度比等信息。在cb_typefound()中,可使用gst_caps_to_string(caps)函數將數據強制轉換成一個字符串,也可用 gst_caps_get_structure(caps,0)函數將數據轉換成為一個structure類型數據,以便播放使用。

4 結束語

文中介紹了GStreamer的一些基礎知識,并簡單介紹了GStreamer庫的安裝。在閱讀、分析GStreamer源碼的基礎上,著重講述了GStreamer的工作原理,討論了如何利用其管道的思想來實現多種音視頻格式文件的播放,包括播放管道的設計以及媒體文件類型的獲取,并演示了如何利用GStreamer框架構建簡單、高效的媒體播放管道。由于GStreamer為用戶提供了大量的公用API,使用它來構建播放管道具有易于開發,易于移植的特點,極具實際應用價值。

[1]Taymans W,Baker S,Wingo A,et al.GStreamer Application Development Manual(0.10.35.1) [EB/OL].[2011-07-15].http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf.

[2]Boulton R J,Walthinsen E, Baker S,et al.GStreamer Plugin Writer’s Guide(0.10.35.1) [EB/OL].[2011-08-11].http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/pwg.pdf.

[3]gstreamer-0.10.35.tar.gz[CP/OL]. [2011-07-15].http://gstreamer.freedesktop.org/src/gstreamer/.

[4]GObject Reference Manual[EB/OL].http://developer.gnome.org/gobject/stable/.

[5]張海濱,李揮,吳曄等.嵌入式高清播放器的設計與實現[J].計算機工程與設計,2010,31 (13):3086.

ZHANG Hai-bin,LIHui,WU Ye,etal.Design and implementation ofembedded high definition player[J].Computer Engineering and Design,2010,31(13):3086.

[6]GStreamer 0.10 Core Reference Manual (0.10.35.1) [EB/OL].[2011-07-10].http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/

猜你喜歡
多媒體
借助多媒體探尋有效設問的“四度”
巧用多媒體 學生樂識字
甘肅教育(2020年21期)2020-04-13 08:09:26
移動云計算中多媒體工作流的節能計算卸載
電子制作(2019年22期)2020-01-14 03:16:28
多媒體在初中化學教學中的運用
時代人物(2019年29期)2019-11-25 01:35:20
多媒體在《機械制圖》課中的應用
消費導刊(2018年10期)2018-08-20 02:56:28
初中化學因多媒體而綻放光彩
基于Android 多媒體管理系統的研究
巧用多媒體 讓課堂練筆更加有效
中小學電教(2016年3期)2016-03-01 03:40:51
多媒體達人煉成記
河南電力(2016年5期)2016-02-06 02:11:40
提高高中數學多媒體課件質量的幾點思考
主站蜘蛛池模板: 亚洲美女一区二区三区| 国产亚洲视频中文字幕视频| 激情六月丁香婷婷四房播| 日本不卡免费高清视频| 国产亚洲精| 人妻丰满熟妇av五码区| 亚洲精品另类| 露脸一二三区国语对白| 国产成人一区| 激情网址在线观看| 国产精品区视频中文字幕| 在线免费不卡视频| 国产在线观看人成激情视频| 免费国产小视频在线观看| 激情综合网激情综合| 992Tv视频国产精品| 日韩视频精品在线| 无码在线激情片| 国产经典三级在线| 欧美在线国产| 成年人免费国产视频| 狠狠综合久久| 亚洲国产成人久久77| 国产亚洲欧美日本一二三本道| 亚洲高清国产拍精品26u| 国产精品久久久久久久久kt| 久草青青在线视频| 欧美国产综合视频| 亚洲一级毛片在线播放| 国产区免费| 青草精品视频| 国产日本欧美亚洲精品视| 毛片视频网| 国产精品吹潮在线观看中文| 国产在线观看一区二区三区| 91在线无码精品秘九色APP| 欧美无遮挡国产欧美另类| 久草国产在线观看| 伊人久久青草青青综合| 2021国产精品自产拍在线观看| 国产在线一区视频| 欧美黄色网站在线看| 中文字幕免费视频| 中文字幕亚洲乱码熟女1区2区| 在线国产毛片| 久久毛片免费基地| 久久久久无码精品| 曰AV在线无码| 99人妻碰碰碰久久久久禁片| 欧美色综合久久| 中国黄色一级视频| 不卡的在线视频免费观看| 一区二区午夜| 青青青国产精品国产精品美女| 国产爽妇精品| 一级毛片a女人刺激视频免费| 亚洲三级视频在线观看| 日韩免费毛片| 国产精品七七在线播放| 国产精品手机视频| 国产成人精品视频一区二区电影| 日韩精品资源| 午夜在线不卡| 一级黄色欧美| 国产在线视频二区| 狠狠色综合网| h网址在线观看| 91系列在线观看| 亚洲大尺度在线| 亚洲色图欧美视频| 动漫精品啪啪一区二区三区| 国模视频一区二区| 国产亚洲男人的天堂在线观看 | 国产福利影院在线观看| 精品国产电影久久九九| 日本精品一在线观看视频| 亚洲国产精品一区二区第一页免| 青青青国产视频手机| 国产哺乳奶水91在线播放| 国产精品网拍在线| 国产乱人伦精品一区二区| 成人精品区|