版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、GSTREAMERGstreamer應(yīng)用開發(fā)手冊(version 0.10.3.1)G (已關(guān)閉)2007/12/4GStreamer is a library for constructing graphs of media-handling components. The applications it supports range from simple Ogg/Vorbis playback, audio/video streaming to complex audio (mixing) and video (non-linear editing) processing.I. 介紹1第
2、1章. 序言3第2章. 動(dòng)機(jī)和目標(biāo)5第3章. 基礎(chǔ)概念介紹8II.構(gòu)建一個(gè)應(yīng)用程序10第4章. 初始化GStreamer12第5章. 元件(Element)14第6章. 箱柜(Bins)20第7章. 總線(Bus)22第8章. 襯墊(Pads)及其功能25第9章. 緩沖區(qū)(Buffers)和事件(Events)32第10章. 你的第一個(gè)應(yīng)用程序33III.GStreamer高階概念36第11章. 位置跟蹤(Tracking)與位置偏移 (Seeking)37第12章. 元數(shù)據(jù)39第13章. 接口39第14章. GStreamer中的時(shí)鐘41第15章. 動(dòng)態(tài)控制參數(shù)42第16章. 線程43第17
3、章. 自動(dòng)加載(Autoplugging)44第18章. 管道控制50IV. 高級(jí)接口在GStreamer中的應(yīng) 用54第19章. 組件(Components)55第20章. XML在GStreamer 中的應(yīng)用58I. 介紹GStreamer是一個(gè)非常強(qiáng)大而且通用的流媒體應(yīng)用程序框架。GStreamer所具備的很多優(yōu)點(diǎn)來源于其框架的模塊化:GStreamer能夠無縫的合并新的插件。 但是, 由于追求模塊化和高效率, 使得GStreamer在整個(gè)框架上變的復(fù)雜, 也同時(shí)因?yàn)閺?fù)雜度的提高, 使得開發(fā)一個(gè)新的應(yīng)用程序顯得不是那么的簡單。這個(gè)指南試圖幫助你了解GStreamer的框架(version
4、 0.10.3.1)以方便你在GStreamer框架的基礎(chǔ)上做開發(fā)。 第一章節(jié)將重點(diǎn)關(guān)注如何開發(fā)一個(gè)簡單的音頻播放器, 通過對整個(gè)過程的講解,力圖使你能夠理解有關(guān)GStreamer的一些概念。 在之后的章節(jié)中,我們將討論一些關(guān)于媒體播放(playback)控制的高級(jí)問題, 這些問題包括了錄音、錄象和編輯等等。目 錄第1章. 序言31.1.GStreamer是什么 ?31.2. 誰需要讀這個(gè)手冊?31.3. 預(yù)備知識(shí)31.4. 本手冊結(jié)構(gòu)3第2章. 動(dòng)機(jī)和目標(biāo)52.1.當(dāng)前的問題52.2.設(shè)計(jì)目標(biāo)6第3章. 基礎(chǔ)概念介紹83.1. 元件(Elements)83.2. 箱柜(Bins)和管道(pi
5、pelines)83.3. 襯墊(Pads)8第1章. 序言本章將從技術(shù)的角度來描述本手冊的總體結(jié)構(gòu)。1.1.GStreamer是什么 ?GStreamer是一個(gè)創(chuàng)建流媒體應(yīng)用程序的框架。其基本設(shè)計(jì)思想來自于俄勒岡(Oregon)研究生學(xué)院有關(guān)視頻管道的創(chuàng)意, 同時(shí)也借鑒了DirectShow的設(shè)計(jì)思想。GStreamer的程序開發(fā)框架使得編寫任意類型的流媒體應(yīng)用程序成為了可能。在編寫處理音頻、視頻或者兩者皆有的應(yīng)用程序時(shí),GStreamer可以讓你的工作變得簡單。GStreamer并不受限于音頻和視頻處理, 它能夠處理任意類型的數(shù)據(jù)流。管道設(shè)計(jì)的方法對于實(shí)際應(yīng)用的濾波器幾乎沒有負(fù)荷, 它甚至
6、可以用來設(shè)計(jì)出對延時(shí)有很高要求的高端音頻應(yīng)用程序。GStreamer最顯著的用途是在構(gòu)建一個(gè)播放器上。GStreamer已經(jīng)支持很多格式的文件了, 包括: MP3、Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、 mod等等。從這個(gè)角度看,GStreamer更象是一個(gè)播放器。但是它主要的優(yōu)點(diǎn)卻是在于: 它的可插入組件能夠很方便的接入到任意的管道當(dāng)中。這個(gè)優(yōu)點(diǎn)使得利用GStreamer編寫一個(gè)萬能的可編輯音視頻應(yīng)用程序成為可能。GStreamer框架是基于插件的, 有些插件中提供了各種各樣的多媒體數(shù)字信號(hào)編解碼器,也有些提供了其他的功能。所有的插件都能夠被鏈接到任意的已經(jīng)定義
7、了的數(shù)據(jù)流管道中。GStreamer的管道能夠被GUI編輯器編輯, 能夠以XML文件來保存。這樣的設(shè)計(jì)使得管道程序庫的消耗變得非常少。GStreamer核心庫函數(shù)是一個(gè)處理插件、數(shù)據(jù)流和媒體操作的框架。GStreamer核心庫還提供了一個(gè)API, 這個(gè)API是開放給程序員使用的-當(dāng)程序員需要使用其他的插件來編寫他所需要的應(yīng)用程序的時(shí)候可以使用它。1.2. 誰需要讀這個(gè)手冊?本手冊是從一個(gè)程序開發(fā)人員的角度來描述GStreamer的: 它敘述了如何利用GStreamer的開發(fā)庫以及工具來編寫一個(gè)基于GStreamer的應(yīng)用程序。對于想學(xué)習(xí)如何編寫插件的朋友們, 我們建議你去參考。1.3. 預(yù)備知
8、識(shí)為了更好的理解本手冊的內(nèi)容, 你應(yīng)該具備基本的C語言基礎(chǔ)。由于GStreamer一直采用GObject編程模式, 所以本手冊也假定你已經(jīng)理解了GObject的基本概念。你可能還需要一些GTK+和GDK的知識(shí), 這方面的知識(shí)你可以參照Eric Harlow的書Developing Linux Applications with GTK+ and GDK。另外, 當(dāng)你讀完本手冊后, 請讀一下GStreamer Plugin Writers Guide。 當(dāng)然,你還需要關(guān)注一下其它的GStreamer文檔。1.4. 本手冊結(jié)構(gòu)為了幫助你更好的學(xué)習(xí)本手冊, 我們將本手冊分為幾個(gè)大的部分, 每一部分闡
9、述了一個(gè)在GStreamer應(yīng)用程序開發(fā)過程中特殊而又有用的話題。如下所示:Part I -GStreamer應(yīng)用程序開發(fā)手冊 (0.10.9.1)給你一個(gè)關(guān)于GStreamer總的概況敘述。Part II -GStreamer應(yīng)用程序開發(fā)手冊 (0.10.9.1)闡述GStreamer應(yīng)用程序開發(fā)的基本概念。本章結(jié)束后, 你將可以使用GStreamer來開發(fā)你自己的音頻播放器。Part III -GStreamer應(yīng)用程序開發(fā)手冊 (0.10.9.1)我們將繼續(xù)討論一些有關(guān)GStreamer深層次的主題, 這些主題告訴了我們?yōu)槭裁碐Streamer能在眾多的競爭者當(dāng)中脫穎而出。我們將使用動(dòng)態(tài)
10、參數(shù)和動(dòng)態(tài)接口來討論應(yīng)用程序中管道的交訊問題, 我們還將討論線程同步、時(shí)鐘同步、以及其他同步問題。這些問題的討論不僅向你講述如何使用GStreamer的API, 而且還將告訴你一些基于GStreamer應(yīng)用程序開發(fā)過程中所經(jīng)常遇到的問題的解決辦法, 通過這些知識(shí)的學(xué)習(xí)使你更加深刻的理解GStreamer的基本概念。Part IV -GStreamer應(yīng)用程序開發(fā)手冊 (0.10.9.1)我們將進(jìn)入GStreamer的高級(jí)編程領(lǐng)域。你不需要對GStreamer所有的細(xì)節(jié)都了解清楚,但是基本的GStreamer概念仍然是需要的。我們將討論XML、playbin、 autopluggers等話題。P
11、art V -GStreamer應(yīng)用程序開發(fā)手冊 (0.10.9.1)你將學(xué)習(xí)到一些有關(guān)GStreamer與GNOME、KDE、OS、X或者Windows集成的知識(shí), 當(dāng)然你還將學(xué)習(xí)到一些有關(guān)調(diào)試和如何處理常見問題的方法。通過這些知識(shí)的學(xué)習(xí), 將更好的方便你使用GStreamer第2章. 動(dòng)機(jī)和目標(biāo)從歷史的角度來看,Linux在多媒體方面已經(jīng)遠(yuǎn)遠(yuǎn)落后于其他的操作系統(tǒng)。Microsofts Windows和Apples MacOS它們對多媒體設(shè)備、多媒體創(chuàng)作、播放和實(shí)時(shí)處理等方面已經(jīng)有了很好的支持。另一方面,Linux對多媒體應(yīng)用的綜合貢獻(xiàn)比較少,這也使得Linux很難在專業(yè)級(jí)別的軟件上與MS
12、Windows和MacOS去競爭。GStreamer正是為解決Linux多媒體方面當(dāng)前問題而設(shè)計(jì)的。2.1.當(dāng)前的問題我們描述了當(dāng)今Linux平臺(tái)下媒體處理的一些典型問題。2.1.1.大量的代碼復(fù)制對于那些想要播放一個(gè)聲音文件的Linux用戶來說,他們必須搜索各種聲音播放器來播放不同格式文件,而在這些播放器中,大部分的都一遍又一遍地重復(fù)使用了相同的代碼。對于那些想在應(yīng)用程序中嵌入視頻剪輯的Linux開發(fā)人員來說,他們必須要用粗略的hacks來運(yùn)行外部的視頻播放器,因?yàn)闆]有一套可用的庫提供給開發(fā)人員來創(chuàng)建可定制的播放器。2.1.2. “一個(gè)目標(biāo)”媒體播放器/媒體庫典型的MPEG播放器可以播放MP
13、EG視頻和音頻,多數(shù)的播放器實(shí)現(xiàn)了完整的底層構(gòu)造來達(dá)到他們的唯一目標(biāo):播放。沒有一套有效的機(jī)制可以提供對于音頻和視頻數(shù)據(jù)過濾和效果處理,更沒有制定在視頻或音頻數(shù)據(jù)中添加濾波器或特殊效果的任何規(guī)定。如果你希望將MPEG-2視頻流轉(zhuǎn)為AVI文件,那么你的最佳選擇是,將所有的MPEG-2解碼算法從播放器分離出來,并復(fù)制到你的AVI編碼器中,因?yàn)檫@類算法不能簡單的在應(yīng)用程序之間共享。開發(fā)人員曾經(jīng)嘗試著創(chuàng)建一個(gè)可以處理多種媒體類型的庫,但由于缺乏通用的API,所以如何集成就成了重要的工作了。因?yàn)樵诩傻倪^程中,我們需要關(guān)注一些特殊的媒體類型(avi文件,libmpeg2,.),而集成這些媒體類型文件需要
14、一個(gè)統(tǒng)一的接口。GStreamer允許將這些庫與通用的API一起打包,這樣就簡化了集成和復(fù)用。2.1.3.沒有統(tǒng)一的插件管理機(jī)制典型的播放器對于不同的媒體類型會(huì)有不同的插件,兩個(gè)媒體播放器會(huì)實(shí)現(xiàn)各自不同的插件機(jī)制,所以編解碼器不能方便的交換。每一個(gè)典型的媒體播放器的插管理件系統(tǒng)是具有其特定應(yīng)用程序的需求。缺少統(tǒng)一的插件機(jī)制,已經(jīng)嚴(yán)重阻礙了二進(jìn)制編解碼器的發(fā)展,因?yàn)闆]有一家公司希望將代碼移植到不同的插件機(jī)制。GStreamer當(dāng)然也采用自己的插件系統(tǒng),它為插件開發(fā)者提供了一個(gè)非常豐富的框架,從而保證這些插件能夠廣泛應(yīng)用,并與其他插件能夠無縫的交互。GStreamer為插件提供的框架是非常靈活,它
15、足以滿足大多數(shù)插件的需求。2.1.4.拙劣的用戶感因?yàn)樯鲜鰡栴}的原因,使得應(yīng)用程序開發(fā)人員將相當(dāng)多的時(shí)間花在如何處理后端、插件機(jī)制等等問題上。從而耽誤了大部分的項(xiàng)目時(shí)間,這樣就常常導(dǎo)致后端和用戶界面都只完成了一半,于是就導(dǎo)致了拙劣的用戶感。2.1.5.沒有網(wǎng)絡(luò)透明度的規(guī)定當(dāng)前還沒有一個(gè)底層框架出現(xiàn),來允許對網(wǎng)絡(luò)透明媒體的操作。有趣的是,一個(gè)分布式的MPEG編碼器能夠復(fù)制非分布式編碼器的相同的算法。并沒有關(guān)于使用GNOME和KDE桌面平臺(tái)的技術(shù)的規(guī)定被制定出來,因?yàn)镚NOME和KDE桌面平臺(tái)本身還在改進(jìn)和完善,所以很難將多媒體恰當(dāng)?shù)丶傻胶芏嘤脩舻沫h(huán)境中。注意到GStreamer還提供很多種方法
16、,這些方法提供將GSreamer與不同的桌面系統(tǒng)進(jìn)行集成(見附錄里的集成一節(jié)),而這些方法往往都不是網(wǎng)絡(luò)透明化。GStreamer內(nèi)核在最底層沒有采用網(wǎng)絡(luò)透明技術(shù),只是在頂層加了作為本地使用,這就是說,創(chuàng)建一個(gè)核心組件的包就變得比較容易了。GStreamer允許管道在TCP協(xié)議上分離,使用tcp插件來實(shí)現(xiàn)GStreamer數(shù)據(jù)協(xié)議,這個(gè)被包含在gst-plugins模塊,目錄gst/tcp2.1.6.與Windows的產(chǎn)品還存在差距我們要想看到Linux桌面系統(tǒng)的成功就要立足于可靠的媒體處理。我們必須為商業(yè)編解碼器和多媒體應(yīng)用掃清障礙,這樣Linux才能成為多媒體領(lǐng)域的一個(gè)選擇。2.2.設(shè)計(jì)目
17、標(biāo)我們將闡述在GStreamer開發(fā)中的目標(biāo)2.2.1.結(jié)構(gòu)清晰且威力強(qiáng)大GStreamer提供一套清晰的接口給以下一些開發(fā)人員:l 希望構(gòu)建媒體管道的應(yīng)用程序員。程序員可以使用一系列強(qiáng)有利的工具來創(chuàng)建媒體管道,而不用去寫一行代碼,從而使得復(fù)雜的媒體控制變得非常簡單。l 插件程序員。GStreamer向插件程序員提供了簡潔而簡單的API來創(chuàng)建self-plugin(自包含)插件,同時(shí)還集成了大量的調(diào)試和跟蹤機(jī)制和工具。GStreamer也提供了一系列現(xiàn)實(shí)例子。2.2.2.面向?qū)ο蟮木幊趟枷隚Streamer是依附于GLib 2.0對象模型的,熟悉GLib或者舊版本的GTK+的程序員對GStre
18、amer將會(huì)駕輕就熟。GStreamer采用了信號(hào)與對象屬性的機(jī)制。所有對象的屬性和功能都能在運(yùn)行態(tài)被查詢。GStreamer與GTK+的編程方法非常相似,需要對象模型,對象所有(ownership of objects),參考計(jì)算(reference counting).2.2.3.靈活的可擴(kuò)展性能所有的GStreamer對象都可以采用GObject繼承的方法進(jìn)行擴(kuò)展。所有的插件都可以被動(dòng)態(tài)裝載,可以獨(dú)立的擴(kuò)展或升級(jí)。2.2.4.支持插件以二進(jìn)制形式發(fā)布作為共享庫發(fā)布的插件能夠在運(yùn)行態(tài)直接加載,插件的所有屬性可以由GObject屬性來設(shè)置,而無需(事實(shí)上決不)去安裝插件的頭文件。我們更多的關(guān)
19、注在插件能夠獨(dú)立化,運(yùn)行的時(shí)候還需要很多與插件相關(guān)的因素。2.2.5.高性能高性能主要體現(xiàn)在:l 使用GLib的g_mem_chunk和非模塊化分配算法使得內(nèi)存分配盡可能最小。l 插件之間的連接非常輕型(light-weight)。數(shù)據(jù)在管道中的傳遞使用最小的消耗,管道中插件之間的數(shù)據(jù)傳遞只會(huì)涉及指針廢棄。l 提供了一套對目標(biāo)內(nèi)存直接進(jìn)行操作的機(jī)制。例如,插件可以向X server共享的內(nèi)存空間直接寫數(shù)據(jù),緩沖區(qū)也可以指向任意的內(nèi)存,如聲卡的內(nèi)部硬件緩沖區(qū)。l refcounting和寫拷貝將memcpy減少到最低。子緩沖區(qū)有效地將緩沖區(qū)分離為易于管理的塊。l 使用線程聯(lián)合(cothreads
20、)減少線程消耗。線程聯(lián)合(cothreads)是簡單又高速的方法來切換子程序,作為衡量最低消耗600個(gè)cpu周期的標(biāo)準(zhǔn)。l 使用特殊的插件從而支持硬件加速。l 采用帶有說明的插件注冊,這樣的話只在實(shí)際需要使用該插件才會(huì)去裝載。l 所有的判斷數(shù)據(jù)都不用互斥鎖。2.2.6. 核心庫與插件(core/plugins)分離GStreamer內(nèi)核的本質(zhì)是media-agnostic,我們了解的僅僅是字節(jié)和塊,以及包含基本的元件,GStreamer內(nèi)核的強(qiáng)大功能甚至能夠?qū)崿F(xiàn)底層系統(tǒng)工具,像cp。所有的媒體處理功能都是由插件從外部提供給內(nèi)核的,并告訴內(nèi)核如何去處理特定的媒體類型。2.2.7.為多媒體數(shù)字信號(hào)
21、編解碼實(shí)驗(yàn)提供一個(gè)框架GStreamer成為一個(gè)簡單的框架,編解碼器的開發(fā)人員可以試驗(yàn)各種不同的算法,提高開源多媒體編解碼器開發(fā)的速度,如Theora and Vorbis。第3章. 基礎(chǔ)概念介紹本章將介紹GStreamer的基本概念。理解這些概念對于你后續(xù)的學(xué)習(xí)非常重要,因?yàn)楹罄m(xù)深入的講解我們都假定你已經(jīng)完全理解了這些概念。3.1. 元件(Elements)元件(element)是GStreamer中最重要的概念。你可以通過創(chuàng)建一系列的元件(Elements),并把它們連接起來,從而讓數(shù)據(jù)流在這個(gè)被連接的各個(gè)元件(Elements)之間傳輸。每個(gè)元件(Elements)都有一個(gè)特殊的函數(shù)接口
22、,對于有些元件(Elements)的函數(shù)接口它們是用于能夠讀取文件的數(shù)據(jù),解碼文件數(shù)據(jù)的。而有些元件(Elements)的函數(shù)接口只是輸出相應(yīng)的數(shù)據(jù)到具體的設(shè)備上(例如,聲卡設(shè)備)。你可以將若干個(gè)元件(Elements)連接在一起,從而創(chuàng)建一個(gè)管道(pipeline)來完成一個(gè)特殊的任務(wù),例如,媒體播放或者錄音。GStreamer已經(jīng)默認(rèn)安裝了很多有用的元件(Elements),通過使用這些元件(Elements)你能夠構(gòu)建一個(gè)具有多種功能的應(yīng)用程序。當(dāng)然,如果你需要的話,你可以自己編寫一個(gè)新的元件(Elements)。對于如何編寫元件(Elements)的話題在GStreamer Plugi
23、n Writers Guide中有詳細(xì)的說明。3.2. 箱柜(Bins)和管道(pipelines)箱柜(Bins)是一個(gè)可以裝載元件(element)的容器。管道(pipelines)是箱柜(Bins)的一個(gè)特殊的子類型,管道(pipelines)可以操作包含在它自身內(nèi)部的所有元件(element)。因?yàn)橄涔?Bins)本身又是元件(element)的子集,所以你能夠象操作普通元件(element)一樣的操作一個(gè)箱柜(Bins), 通過這種方法可以降低你的應(yīng)用程序的復(fù)雜度。你可以改變一個(gè)箱柜(Bins)的狀態(tài)來改變箱柜(Bins)內(nèi)部所有元件(element)的狀態(tài)。箱柜(Bins)可以發(fā)送
24、總線消息(bus messages)給它的 子集元件(element)(這些消息包括:錯(cuò)誤消息(error messages),標(biāo)簽消息(tag messages),EOS消息(EOS messages)。管道(pipeline)是高級(jí)的箱柜(Bins)。當(dāng)你設(shè)定管道的暫?;蛘卟シ艩顟B(tài)的時(shí)候,數(shù)據(jù)流將開始流動(dòng),并且媒體數(shù)據(jù)處理也開始處理。一旦開始,管道將在一個(gè) 單獨(dú)的線程中運(yùn)行,直到被停止或者數(shù)據(jù)流播放完畢。3.3. 襯墊(Pads)襯墊(Pads)在GStreamer中被用于多個(gè)元件的鏈接,從而讓數(shù)據(jù)流能在這樣的鏈接中流動(dòng)。 一個(gè)襯墊(Pads)可以被看作是一個(gè)元件(element)插座或者
25、端口,元件(element)之間的鏈接就是依靠著襯墊(Pads)。 襯墊(Pads)有處理特殊數(shù)據(jù)的能力:一個(gè)襯墊(Pads)能夠限制數(shù)據(jù)流類型的通過。鏈接成功的條件是:只有在兩個(gè)襯墊(Pads)允許通過的數(shù)據(jù)類型一致的時(shí)候才被建立。數(shù)據(jù)類型的設(shè)定使用了一個(gè)叫做caps negotiation的方法。數(shù)據(jù)類型被為一個(gè)GstCaps變量所描述。下面的這個(gè)比喻可能對你理解襯墊(Pads)有所幫助。一個(gè)襯墊(Pads)很象一個(gè)物理設(shè)備上的插頭。 例如一個(gè)家庭影院系統(tǒng)。一個(gè)家庭影院系統(tǒng)由一個(gè)功放(amplifier),一個(gè)DVD機(jī),還有一個(gè)無聲的視頻投影組成。 我們需要連接DVD機(jī)到功放(amplif
26、ier),因?yàn)閮蓚€(gè)設(shè)備都有音頻插口;我們還需要連接投影機(jī)到DVD機(jī)上,因?yàn)?兩個(gè)設(shè)備都有視頻處理插口。但我們很難將投影機(jī)與功放(amplifier)連接起來,因?yàn)樗麄冎g處理的是不同的 插口。GStreamer襯墊(Pads)的作用跟家庭影院系統(tǒng)中的插口是一樣的。對于大部分情況,所有的數(shù)據(jù)流都是在鏈接好的元素之間流動(dòng)。數(shù)據(jù)向元件(element)以外流出可以通過一個(gè)或者多個(gè)source 襯墊(Pads),元件(element)接受數(shù)據(jù)是通過一個(gè)或者多個(gè)sink 襯墊(Pads)來完成的。Source元件(element)和sink元件(element)分別有且僅有一個(gè) sink 襯墊(Pads
27、)或者source 襯墊(Pads)。數(shù)據(jù)在這里代表的是緩沖區(qū)(buffers) (GstBuffer對象描述了數(shù)據(jù)的緩沖區(qū)(buffers)的信息)和事件(events) (GstEvent對象描述了數(shù)據(jù)的事件(events)信息)。II.構(gòu)建一個(gè)應(yīng)用程序在這一部分,我們將討論GStreamer中的一些基本概念以及一些常用的對 象,像元件、襯墊和緩存等。我們給這些對象以一種形象化的描述,相信這樣會(huì)對我們在后邊學(xué)習(xí)到如何構(gòu)建一條管道時(shí)大有幫助。首先你會(huì)對GStreamer的API有個(gè)粗略的認(rèn)識(shí),用這些API來構(gòu)建一個(gè)基于元件的應(yīng)用程序已經(jīng)綽綽有余。然后你 會(huì)學(xué)習(xí)到如何構(gòu)建一個(gè)簡單的基于命令行的
28、應(yīng)用程序。注意:在這部分我們會(huì)了解一些底層(low-level)的API以及GStreamer的 一些概念。如果你立馬想構(gòu)建一個(gè)應(yīng)用程序,你可能會(huì)使用一些高層(higher-level)的API,它們會(huì)在這手冊的后部分被提到。目錄第4章. 初始化GStreamer124.1. 簡易初始化124.2. 使用GOption接口來初始化12第5章. 元件(Element)145.1. 什么是元件?145.2. 創(chuàng)建一個(gè)GstElement對象155.3.使用元件作為GObject 對象165.4. 深入了解元件工廠175.5. 鏈接元件185.6. 元件狀態(tài)19第6章. 箱柜(Bins)206.1.
29、什么是箱柜206.2. 創(chuàng)建箱柜206.3.自定義箱柜21第7章. 總線(Bus)227.1. 如何使用一個(gè)總線(Bus)227.2. 消息類型(Message types)24第8章. 襯墊(Pads)及其功能258.1. 襯墊(Pads)258.2.襯墊(Pads)的性能278.3.襯墊(Pads)性能的用途288.4. 精靈襯墊(Ghost pads)30第9章. 緩沖區(qū)(Buffers)和事件(Events)329.1. 緩沖區(qū)(Buffers)329.2. 事件(Events)32第10章. 你的第一個(gè)應(yīng)用程序3310.1. 第一個(gè)Hello world程序3310.2. 編譯運(yùn)行h
30、elloworld.c3510.3. 結(jié)論35第4章. 初始化GStreamer當(dāng)你準(zhǔn)備寫一個(gè)GStreamer應(yīng)用程序時(shí),你僅需要通過包含頭文件gst/gst.h 來訪問庫函數(shù)。除此之外,不要忘記初始化GStreamer庫。4.1. 簡易初始化在GStreamer庫被使用前,主應(yīng)用程序中應(yīng)該先調(diào)用函數(shù)gst_init,這個(gè)函數(shù)將會(huì)對GStreamer庫做一些必要的初始化工作,同時(shí) 也能夠?qū)Streamer的命令行參數(shù)進(jìn)行解析。一個(gè)典型的初始化GStreamer庫的代碼1如下所示:例4-1. 初始化GStreamer#include intmain (int argc, char *argv
31、) const gchar *nano_str; guint major, minor, micro, nano; gst_init (&argc, &argv); gst_version (&major, &minor, µ, &nano); if (nano = 1) nano_str = (CVS); else if (nano = 2) nano_str = (Prerelease); else nano_str = ; printf (This program is linked against GStreamer %d.%d.%d %sn, major, minor, m
32、icro, nano_str); return 0;你可以使用GST_VERSION_MAJOR, GST_VERSION_MINOR以及GST_VERSION_MICRO 三個(gè)宏得到你的GStreamer版本信息,或者使用函數(shù)gst_version得到當(dāng)前你所調(diào)用的程序庫的版本信息。目前GStreamer使用了一種 保證主要版本和次要版本中API-/以及ABI兼容的策略。當(dāng)命令行參數(shù)不需要被GStreamer解析的時(shí)候,你可以在調(diào)用函數(shù)gst_init時(shí)使用2個(gè)NULL參數(shù)。 注1 這個(gè)例子中的代碼可以直接提取出來,并在GStreamer的examples/manual目錄下可以找到。4.2
33、. 使用GOption接口來初始化你同樣可以使用GOption表來初始化你的參數(shù)。例子如下:例4-2. 使用GOption接口來初始化#include intmain (int argc, char *argv) gboolean silent = FALSE; gchar *savefile = NULL; GOptionContext *ctx; GError *err = NULL; GOptionEntry entries = silent, s, 0, G_OPTION_ARG_NONE, &silent, do not output status information, NULL
34、 , output, o, 0, G_OPTION_ARG_STRING, &savefile, save xml representation of pipeline to FILE and exit, FILE , NULL ; ctx = g_option_context_new (- Your application); g_option_context_add_main_entries (ctx, entries, NULL); g_option_context_add_group (ctx, gst_init_get_option_group (); if (!g_option_c
35、ontext_parse (ctx, &argc, &argv, &err) g_print (Failed to initialize: %sn, err-message); g_error_free (err); return 1; printf (Run me with -help to see the Application options appended.n); return 0;如例子中的代碼所示,你可以通過GOption表來定義你的命令行選項(xiàng)。將表與由gst_init_get_option_group函數(shù)返回的選項(xiàng)組一同傳給GLib初始化函數(shù)。通過使用GOption表來初始化G
36、Sreamer,你的程序還可以解析除標(biāo)準(zhǔn)GStreamer選項(xiàng)以外的命令行選項(xiàng)第5章. 元件(Element)對程序員來說,GStreamer 中最重要的一個(gè)概念就是GstElement對象。元件是構(gòu)建一個(gè)媒體管道的基本塊。所有上層(high-level)部件都源自GstElement對象。任何一個(gè)解碼器編碼器、分離器、視頻/音頻輸出部件實(shí)際上都是一個(gè) GstElement對象。5.1. 什么是元件?對程序員來說,元件就像一個(gè)黑盒子。你從元件的一端輸入數(shù)據(jù),元件對數(shù)據(jù)進(jìn)行一些處理,然后數(shù)據(jù)從元件的另一段輸出。拿一個(gè)解碼元件來說,你輸入一 些有特定編碼的數(shù)據(jù),元件會(huì)輸出相應(yīng)的解碼數(shù)據(jù)。在下一章
37、(Pads and capabilities),你將學(xué)習(xí)到更多關(guān)于對元件進(jìn)行數(shù)據(jù)輸入輸出的知識(shí),以及如何在你的程序中實(shí)現(xiàn)數(shù)據(jù)的輸入輸出。5.1.1.源元件源元件(Source elements)為管道產(chǎn)生數(shù)據(jù),比如從磁盤或者聲卡讀取數(shù)據(jù)。圖 5-1形象化的源元件。我們總是將源襯墊(source pad)畫在元件的右端。圖 5-1.形象化的源元件源元件不接收數(shù)據(jù),僅產(chǎn)生數(shù)據(jù)。你可從上圖中明白這一點(diǎn),因?yàn)樯蠄D僅有一個(gè)源襯墊(右端),同樣的, 源襯墊也僅產(chǎn)生數(shù)據(jù)(對外部而言)。5.1.2. 過濾器(filters)、轉(zhuǎn)換器(convertors)、分流器(demuxers)、整流器(muxers)以
38、及編解碼器(codecs)過濾器(Filters)以及類過濾元件(Filter-like elements)都同時(shí)擁有輸入和輸出襯墊。他們對從輸入襯墊得到的數(shù)據(jù)進(jìn)行操作,然后將數(shù)據(jù)提供給輸出襯墊。音量元件(filter)、視頻轉(zhuǎn)換器 (convertor)、Ogg分流器或者 Vorbis 解碼器都是這種類型的元件。類過濾元件可以擁有任意個(gè)的源襯墊或者接收襯墊。像一個(gè)視頻分流器可能有一個(gè)接收襯墊以及多個(gè)(1-N)源襯墊,每個(gè)接收襯墊對應(yīng)一種元數(shù)據(jù)流 (elementary stream)。相反地,解碼器只有一個(gè)源襯墊及一個(gè)接收襯墊。圖5-2.形象化的過濾元件圖5-2形象化了類過濾元件。這個(gè)特殊的
39、元件同時(shí)擁有源端和接收端。接收輸入數(shù)據(jù)的接收襯墊在元件的左端,源襯墊在右端。圖5-3.形象化的擁有多個(gè)輸出的過濾元件圖5-3顯示了另一種了類過濾元件。它有多個(gè)輸出襯墊(source pad)。Ogg分流器是個(gè)很好的實(shí)例。因?yàn)镺gg流包含了視頻和音頻。一個(gè)源襯墊可能包含視頻元數(shù)據(jù)流,另一個(gè)則包含音頻元數(shù)據(jù)流。當(dāng)一個(gè)新的襯墊被創(chuàng) 建時(shí),分流器通常會(huì)產(chǎn)生一個(gè)信號(hào)。程序員可以在信號(hào)處理事件中處理新的元數(shù)據(jù)流。5.1.3.接收元件接收元件是媒體管道的末端,它接收數(shù)據(jù)但不產(chǎn)生任何數(shù)據(jù)。寫磁盤、利用聲卡播放聲音以及視頻輸出等都是由接收元件實(shí)現(xiàn)的。圖 5-4顯示了接收元件。圖5-4.形象化的接收元件5.2.
40、創(chuàng)建一個(gè)GstElement對象創(chuàng)建一個(gè)元件的最簡單的方法是通過函數(shù)gst_element_factory_make ()。 這個(gè)函數(shù)使用一個(gè)已存在的工廠對象名和一個(gè)新的元件名來創(chuàng)建元件。創(chuàng)建完之后, 你可以用新的元件名在箱柜(bin)中查詢得到這個(gè)元件。這個(gè)名字同樣可以用來調(diào)試程序的輸 出。你可以通過傳遞 NULL 來得到一個(gè)默認(rèn)的具有唯一性的名字。當(dāng)你不再需要一個(gè)元件時(shí),你需要使用gst_object_unref ()來對它進(jìn)行解引用。 這會(huì)將一個(gè)元件的引用數(shù)減少1。任何一個(gè)元件在創(chuàng)建時(shí),其引用記數(shù)為1。當(dāng)其引用記數(shù)為0時(shí),該元件會(huì)被銷毀。下面的例子1顯示了如果通過一個(gè)fakesrc工廠對
41、象來創(chuàng)建一個(gè)名叫source的元件。程序會(huì)檢查元件是否創(chuàng)建成功。檢查完畢后,程序會(huì)銷毀元件。#include intmain (int argc, char *argv) GstElement *element; /* init GStreamer */ gst_init (&argc, &argv); /* create element */ element = gst_element_factory_make (fakesrc, source); if (!element) g_print (Failed to create element of type fakesrcn); retur
42、n -1; gst_object_unref (GST_OBJECT (element); return 0;gst_element_factory_make是2個(gè)函數(shù)的速記。一個(gè)GstElement對象由工廠對象創(chuàng)建而來。為了創(chuàng)建一個(gè)元件,你需要使用一個(gè)唯一的工廠對象名字來訪問一個(gè)GstElementFactory對象。gst_element_factory_find ()就 是做了這樣的事。下面的代碼段創(chuàng)建了一個(gè)工廠對象,這個(gè)工廠對象被用來創(chuàng)建一個(gè)fakesrc元件 偽裝的數(shù)據(jù)源。函數(shù)gst_element_factory_create()將會(huì)使用元件工廠并根據(jù)給定的名字來創(chuàng)建一個(gè)元件。#
43、include intmain (int argc, char *argv) GstElementFactory *factory; GstElement * element; /* init GStreamer */ gst_init (&argc, &argv); /* create element, method #2 */ factory = gst_element_factory_find (fakesrc); if (!factory) g_print (Failed to find factory of type fakesrcn); return -1; element = g
44、st_element_factory_create (factory, source); if (!element) g_print (Failed to create element, even though its factory exists!n); return -1; gst_object_unref (GST_OBJECT (element); return 0; 注1 這個(gè)例子中的代碼可以直接提取出來,并在GStreamer的examples/manual目錄下可以找到。5.3.使用元件作為GObject 對象GstElement的屬性大多通過標(biāo)準(zhǔn)的 GObject 對象實(shí)現(xiàn)的。
45、使用 GObject 的方法可以對GstElement實(shí)行查詢、設(shè)置、獲取屬性的值。同樣 GParamSpecs 也被支持。每個(gè) GstElement 都從其基類 GstObject 繼承了至少一個(gè)“名字”屬性。這個(gè)名字屬性將在函數(shù)gst_element_factory_make ()或者函數(shù)gst_element_factory_create ()中使用到。你可通過函數(shù) gst_object_set_name 設(shè)置該屬性,通過 gst_object_get_name 得到一個(gè)對象的名字屬性。你也可以通過下面的方法來得到一個(gè)對象的名字屬性。#include intmain (int argc,
46、 char *argv) GstElement *element; gchar *name; /* init GStreamer */ gst_init (&argc, &argv); /* create element */ element = gst_element_factory_make (fakesrc, source); /* get name */ g_object_get (G_OBJECT (element), name, &name, NULL); g_print (The name of the element is %s.n, name); g_free (name);
47、 gst_object_unref (GST_OBJECT (element); return 0; 大多數(shù)的插件(plugins)都提供了一些額外的方法,這些方法給程序員提供了更多的關(guān)于該元件的注冊信息或配置信息。gst-inspect 是一個(gè)用來查詢特定元件特性(properties)的實(shí)用工具。它也提供了諸如函數(shù)簡短介紹,參數(shù)的類型及其支持的范圍等信息。關(guān)于 gst-inspect 更詳細(xì)的信息請參考附錄。關(guān)于GObject特性更詳細(xì)的信息,我們推薦你去閱讀GObject手冊以及Glib 對象系統(tǒng)介紹.GstElement對象同樣提供了許多的 GObject 信號(hào)方法來實(shí)現(xiàn)一個(gè)靈活的回調(diào)
48、機(jī)制。你同樣可以使用 gst-inspect來檢查一個(gè)特定元件所支持的信號(hào)。總之,信號(hào)和特性是元件與應(yīng)用程序交互的最基本的方式。5.4. 深入了解元件工廠在前面的部分,我們簡要介紹過GstElementFactory可以用來創(chuàng)建一個(gè)元件的實(shí)例,但是工廠元件不僅僅只能做這件事,工廠元件作為在 GStreamer 注冊系統(tǒng)中的一個(gè)基本類型,它可以描述所有的插件(plugins)以及由GStreamer創(chuàng)建的元件。這意味著工廠元件可以應(yīng)用于一些自動(dòng)元件實(shí)例, 像自動(dòng)插件(autopluggers); 或者創(chuàng)建一個(gè)可用元件列表,像管道對應(yīng)用程序的類似操作(像GStreamerEditor) 。5.4.
49、1.通過元 件工廠得到元件的信息像gst-inspect 這樣的工具可以給出一個(gè)元件的概要: 插件(plugin)的作者、描述性的元件名稱(或者簡稱)、元件的等級(jí)(rank)以及元件的類別(category)。類別可以用來得到一個(gè)元件的類 型,這個(gè)類型是在使用工廠元件創(chuàng)建該元件時(shí)做創(chuàng)建的。例如類別可以是 Codec/Decoder/Video(視頻解碼器)、Source/Video(視頻發(fā)生器)、Sink/Video(視頻輸出器)。音頻也有類似的類別。同樣還存在 Codec/Demuxer和Codec/Muxer,甚至更多的類別。Gst-inspect將會(huì)列出當(dāng)前所有的工廠對象,gst-ins
50、pect 將會(huì)列出特定工廠對象的所有概要信息。#include intmain (int argc, char *argv) GstElementFactory *factory; /* init GStreamer */ gst_init (&argc, &argv); /* get factory */ factory = gst_element_factory_find (audiotestsrc); if (!factory) g_print (You dont have the audiotestsrc element installed!n); return -1; /* disp
51、lay information */ g_print (The %s element is a member of the category %s.n Description: %sn, gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory), gst_element_factory_get_klass (factory), gst_element_factory_get_description (factory); return 0; 你可以通過gst_registry_pool_feature_list (GST_TYPE_ELE
52、MENT_FACTORY)得到所有在GStreamer中注冊過的工廠元件。5.4.2. 找出元件所包含的襯墊工廠元件最有用處的功能可能是它包含了對元件所能產(chǎn)生的襯墊的一個(gè)詳細(xì)描述,以及這些襯墊的功能(以行外話講: 就是指這些襯墊所支持的媒體類型),而得到 這些信息是不需要將所有的插件(plugins)都裝載到內(nèi)存中。這可用來給一個(gè)編碼器提供一個(gè)編碼列表,或在多媒體播放器自動(dòng)加載插件時(shí)發(fā)揮作用。目前 所有基于 GStreamer 的多媒體播放器以及自動(dòng)加載器(autoplugger)都是以上述方式工作。當(dāng)我們在下一章:襯墊與功能(Pads and capabilities)中學(xué)習(xí)到 GstPad
53、 與 GstCaps 時(shí),會(huì)對上面的特性有個(gè)更清晰的了解。5.5. 鏈接元件通過將一個(gè)源元件,零個(gè)或多個(gè)類過濾元件,和一個(gè)接收元件鏈接在一起,你可以建立起一條媒體管道。數(shù)據(jù)將在這些元件間流過。這是 GStreamer 中處理媒體的基本概念。圖5-5 用3個(gè)鏈接的元件形象化了媒體管道。圖5-5.形象化3個(gè)鏈接的元件通過鏈接這三個(gè)元件,我們創(chuàng)建了一條簡單的元件鏈。元件鏈中源元件(element1)的輸出將會(huì)是類過濾元件 (element2)的輸入。類過濾元件將會(huì)對數(shù)據(jù)進(jìn)行某些操作,然后將數(shù)據(jù)輸出給最終的接收元件(element3)。把上述過程想象成一個(gè)簡單的 Ogg/Vorbis 音頻解碼器。源元
54、件從磁盤讀取文件。第二個(gè)元件就是Ogg/Vorbis 音頻解碼器。最終的接收元件是你的聲卡,它用來播放經(jīng)過解碼的音頻數(shù)據(jù)。我們將在該手冊的后部分用一個(gè)簡單的圖來構(gòu)建這個(gè) Ogg/Vorbis 播放器。上述的過程用代碼表示為:#include intmain (int argc, char *argv) GstElement *pipeline; GstElement *source, *filter, *sink; /* init */ gst_init (&argc, &argv); /* create pipeline */ pipeline = gst_pipeline_new (my-pipeline); /* create elements */ source = gst_element_factory_make (fakesrc, source); filter = gst_element_factory_make (identity, filter); sink = gst_element_factory_make (fakesink, sink); /* must add elements to pipeline before linking them */ gst_bin_add_many (GST_BIN (pipeline), source, filt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全策劃及風(fēng)險(xiǎn)分級(jí)管理制度
- 第四章《光現(xiàn)象》基礎(chǔ)練習(xí)題 (含解析)2024-2025學(xué)年物理人教版八年級(jí)上冊
- 《一橋飛架連天塹》課件 2024-2025學(xué)年嶺南美版 (2024)初中美術(shù)七年級(jí)上冊
- 2024至2030年中國普通金屬膨脹螺栓行業(yè)投資前景及策略咨詢研究報(bào)告
- 2014-2018年鉭酸鋰行業(yè)投資分析報(bào)告
- 2010-2012年碳五行業(yè)市場研究與競爭力分析報(bào)告
- 2024年湖南省長沙市中考語文試題含解析
- 2024年中國電子屏市場調(diào)查研究報(bào)告
- 2024年中國冷光無煙煙花市場調(diào)查研究報(bào)告
- 高中語文第12課動(dòng)物游戲之謎課件3新人教版必修
- 統(tǒng)計(jì)學(xué)說課(一門課)課件
- 人教鄂教版六年級(jí)科學(xué)上冊全冊教學(xué)設(shè)計(jì)教案
- 三年級(jí)數(shù)學(xué)趣味競賽試題課件
- (新版)天翼云從業(yè)者寶典考試合集題庫(含答案)
- ECMO(體外膜肺氧合)課件
- 音樂教師個(gè)人專業(yè)發(fā)展三年規(guī)劃
- (建設(shè)項(xiàng)目投資估算范本)
- 實(shí)驗(yàn)室安全檢查記錄表(實(shí)驗(yàn)場所)
- 醫(yī)囑單模板:長期醫(yī)囑單模板與臨時(shí)醫(yī)囑單模板
- 科室運(yùn)營分析模板
- 篆刻學(xué)ppt精品課件
評論
0/150
提交評論