QT中的多媒體類phonon_第1頁
QT中的多媒體類phonon_第2頁
QT中的多媒體類phonon_第3頁
QT中的多媒體類phonon_第4頁
QT中的多媒體類phonon_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

/wangrunmin/article/details/7261779Qtphonon多媒體框架Phonon是什么?Qt從4.4版本開始提供的一套多媒體框架,提供多媒體回放的功能。目前在Qt4.6中實現(xiàn)多媒體播放圖形界面主要依賴于phonon框架,其實qt中還有一個Multimedia模塊,幫助文檔中對它的描述是:實現(xiàn)底層的多媒體播放功能,在一般情況下上層的接口phonon模塊更適合實現(xiàn)這些功能。phonon最初是一個源于KDE的項目,為使用音頻和視頻的應(yīng)用程序開發(fā)提供的一個框架。應(yīng)用程序不用去管多媒體播放是通過什么實現(xiàn)的(如gstreamer、xine),只需調(diào)用相應(yīng)的接口就行,但這中間需要一個中轉(zhuǎn),被稱為backendoQt也是通過phonon來實現(xiàn)夸平臺的多媒體播放。多媒體文件的播放主要過程包括:文件讀取、分流、解碼、輸出。這些在不同的系統(tǒng)中實現(xiàn)方式不同,如windows下的DirectXsLinux下的gstreamer或xine及Mac下的QuickTime。而Qt中的phonon作為夸平臺的多媒體解決方案,就因該為用戶屏蔽掉這些差異。而實際上它做得還不夠好,因為用戶還需要自己來安裝相應(yīng)的后端插件來完成播放任務(wù)。

域照Phinum”「的林沖.暗寫.R律獎觀PhununM■中的?$個方法,實百腫制&端」!Ql域照Phinum”「的林沖.暗寫.R律獎觀PhununM■中的?$個方法,實百腫制&端」!Ql快供化中Qt提供的后端M由是*\ndows:DircctShuu9*Linux::Gstneamcr().HHM:kC)SX;Quick'liriK?.()■后端插件你也可以自己寫.或者我第.h-ItilJphonm-vlt-inph>vr系統(tǒng)撾供,或授你|'1\己提皿.只嘎利你的1柄端描件相郝應(yīng)為心掘供套控制媒體播放的API.井F1劫搜索可用的&筆插件你的Q"PhunonVi省插f;IPhonon1.ih{if2NiE實現(xiàn)解碼、音視頻輸出,蝶體控堂的部分,世以足仲怠肝端?觸你看?之皿配的插f'liyilljPhonon14Plinnoail^看完上圖,你可以知道,應(yīng)用Phonon框架實質(zhì)上分4個部分,你的程序,Phonon庫,Phonon后端插件(phonon_backend),真正的后端。Phonon其實什么都不干,他只是提供了一套API接口,這套接口可以給你的程序調(diào)用,同時也是給編寫后端插件提供一個規(guī)范。程序完全不知道最后誰來放我的Mp3,誰來解碼我的視頻,播放的又是哪個設(shè)備。同樣,Phonon庫也不知道,他只管搜索符合自己規(guī)范的插件。并告訴這些插件,現(xiàn)在程序發(fā)出的指令是什么,從插件返回給程序現(xiàn)在的媒體狀態(tài)和信息。而后端才是實際進行讀入媒體、解碼并且播放的部分,他們和后端插件是一一對應(yīng)的。后端可以是任何形式,只要你寫出了相應(yīng)的后端插件。所以,你要使用Phonon必需要先做3件事:編譯你的Phonon庫:通常情況下,Qt默認(rèn)沒有編譯,你只需要configure后加好參數(shù),然后單獨進入phonon的文件夾進行編譯就可以了編譯你的Phonon后端插件:Qt為3大平臺分別提供了一個可用的后端插件,放在src\plugins\phonon目錄下。進入目錄編譯即可,Qt會自動選擇你當(dāng)前系統(tǒng)的后端插件的。(出現(xiàn)phononbackendplugincouldnotbeloaded就是這步?jīng)]有做)如果你是MinGW用戶,那抱歉了,Windows下Qt只提供了DirectShow這個后端插件,而這個后端插件因為調(diào)用了DX的SDK,所以只能由VC編譯。當(dāng)然你其實有更好的選擇,比如這個phonon-vlc-mplayer插件,通過他,你可以將mplayer作為你的后端,徹底拋棄臃腫的VS以及讀ID3v2都會出錯的DirectShow(其實也不能怪DirectShow,DirectShow同樣只是個框架,解碼還靠系統(tǒng)里安的解碼器、濾鏡們,我用的播放器都太綠色了,于是DirectShow就很弱)(3)你要保證你的后端正常運作:對于Qt提供默認(rèn)提供插件的后端來說,基本不成問題。但要是你想做嵌入式播放器?恩,很大的問題。據(jù)做過GStreamer移植的人反映,這事惱火的很。想做Qt嵌入式播放器的還是老老實實的QProcess+Mplayerslave模式吧?。ㄐ碌腝t4.5說是提供了CE上的DirectShow后端插件,有興趣的可以去試試看)以上3點做完,你就可以拿demo里那個mediaplayer去測試了,測試成功的話,你就可以非常容易的用Qt實現(xiàn)你自己的媒體回放了。想要更高級的操作,比如編碼、混音、儲存媒體文件?呵呵,等Phonon慢慢更新吧,現(xiàn)在來說,Phonon還只是個什么都不能干的傳聲筒。如上所述,如果想要運行使用Qt中的phonon寫的程序,需要滿足一下條件:Qt基本庫、Qtphonon庫、phonon_backend(后端插件)和多媒體播放后臺。下面以linux(Fedora12)系統(tǒng)、Qt4.6、mplayer為例,假設(shè)Qt基本庫已經(jīng)安裝好,默認(rèn)phonon是沒有被安裝的,介紹phonon和后端插件的安裝。Phonon庫安裝:進入源代碼的phonon目錄,如”/usr/src/qt-everywhere-opensource-src-4.6.0/src/phonon”,實際代碼并不在里面,從文件可知源代碼在“/src/3rdparty/phonon/phonon〃應(yīng)并不影響編譯。在終端輸入“make;makeinstall”即可,如果安裝時出錯,也可手動將lib>include下相關(guān)文件拷貝到安裝目錄。后端插件安裝:(1) 下載phonon-mplayer。地址:/trunk/playground/multimedia/phonon-backends/mplayer/使用svn下載:svncosvn:///home/kde/trunk/playground/multimedia/phonon-backends/mplayer(2) 返回phonon-mplayer目錄,編譯(qmake;make)生成phonon_backend/libphonon_mplayer.so動態(tài)鏈接庫。(3) 將libphonon_mplayer.so拷貝到$QTDIR/plugins/phonon_backend/說明:幫助文檔中介紹Linux下Qt默認(rèn)只支持gstreamer,其它的不做保證。但實際中由于mplayer安裝比較方便,支持的文件格式全,使用的人也非常多,所以以mplayer為例。而gstreamer的后端插件可以在系統(tǒng)的“/usr/lib64/kde4/plugins/phonon_backend”目錄直接找到(如果已經(jīng)從源上安裝了的話)。測試examples/phonon/qmusicplayer下的例子用mplayer做后端播放音樂會有問題,這里選擇使用demos/qmediaplayer。當(dāng)然也可以用一個簡單的例子,如下:#include<QtGui>#include<Phonon/MediaObject>#include<Phonon/VideoPlayer>#include<Phonon/BackendCapabilities>intmain(intargv,char**args){QApplicationapp(argv,args);Phonon::MediaObject*music=Phonon::createPlayer(Phonon::MusicCategory,Phonon::MediaSource("/home/dlw/Music/mxshf.mp3”));music->play();/*視頻播放Phonon::MediaObject*music=Phonon::createPlayer(Phonon::VideoCategory,Phonon::MediaSource("/media/DLW/movie/One.Night.in.Supermarket.avi"));music->play();*/returnapp.exec();}Qt4Phonon多媒體框架詳解及簡單實例整體來說,Phonon的架構(gòu)只需要記住以下的三東西:mediaobjectPhonon的基礎(chǔ),用於管理多媒體來源。來源可能是影音檔等,而能夠提供基本的播放控制,例如開始、暫?;蚪Y(jié)束。而提供多媒體資料給mediaobject的則為mediasource,在給mediaobject之前通常是rawdata,再由mediaobject進行轉(zhuǎn)換。sinks輸出多媒體,例如在widget上播放影片或是輸出至音效卡(播放音樂)。通常sink是一個播放的裝置(例如音效卡等)。而sink只接受mediaobject來的資料,由mediaobject控制播放;而由sink來處理這些多媒體paths用來連接Phonon的物件,意即mediaobject與sink之間的連接??蓮南聢D看出彼此的關(guān)系

上圖是一個有聲視頻avi文件的播放機制圖。媒體源DieHard.avi由MediaObject進行管理,而MediaObject與兩個Sink通過Path連接,一個是AudioSink,管理著聲音播放,另一個是VideoSink,管理著視頻播放。最終都是由Sink將媒體數(shù)據(jù)傳送給物理設(shè)備。所以整個播放影音的流程就是首先由mediaobject開始播放,接著把媒體串流經(jīng)由path送至sink,sink會經(jīng)由音效卡等裝置重新播放(playback)影音。【內(nèi)部機制】Phonon有三個基本概念:媒體對象、接收端和路徑。一個媒體對象管理一個媒體源,比如一個音樂文件;它提供了簡單的播放控制,比如開始、停止和暫停播放。一個接收端輸出來自Phonon的媒體,比如,通過提供錄像到一個窗口,或者通過提供聲音到一個聲卡上。路徑是用來連接Phonon對象的,比如,一個媒體對象和一個接收端,從而構(gòu)成了Phonon中的mediagraph,如下:圖1:上圖中,音樂的播放是由mediaobject啟動和管理的,并且mediaobject把媒體流發(fā)送給通過路徑(path)連接到它的接收端(sink),繼而接收端(sink)通過聲卡播放媒體流。而與其他Qt應(yīng)用程式一樣,若有使用到Phonon函式庫的應(yīng)用程式在build的時候都需要額外設(shè)定使用Phonon模組,必須要在qmaekprojectfile(即.pro)中加入:QT+=phonon使用在此部分將會開始介紹如何使用Phonon這套函式庫,并且會列出一些小范例來demo,首先就先來介紹幾個簡單好用的類別。VideoPlayerClassPhonon有提供很多類別可供使用,其中最簡單的,莫過於VideoPlayer這個類別了。VideoPlayerwidget如它的名字一樣,就是用來播放video,而且使用起來相當(dāng)簡易,而且功能也不會缺少,包括播放、暫停與停止。而一開始早先提到的MediaObject等類別與VideoPlayer在使用上有什么差異呢?如果不需要更復(fù)雜的功能,例如建立一個mediagraph,你只需要能夠播放影音檔案的話,其實使用VideoPlayer類別即可達到你的要求。而另外值得一提的就是,VideoPlayer大部分函式都是非同步,所以載入mediasource并不會馬上播放多媒體檔案,只有在呼叫函式play()之彳麥才會播放。要怎么使用這個類別呢?其實相當(dāng)簡單,下面就是程式碼片段:VideoPlayer*player=newVideoPlayer(Phonon::VideoCategory,parentWidget);player->play(url);在實體化VideoPlayer類別物件時,可以在constructor就載入多媒體種類與要放在哪個widget中(即為parentWidget),而mediasource可以利用函式load()來載入或是在play()時載入,而載入方式可直接從檔案或是從網(wǎng)路位址。以下就是一個簡單的影音播放功能小程式:#include<QApplication>#include<QWidget>#include<phonon>#include<QUrl>intmain(intargc,char*argv[])(QApplicationapp(argc,argv);QWidget*widget=newQWidget;widget->setWindowTitle("VideoPlayer");widget->resize(400,400);Phonon::VideoPlayer*player=newPhonon::VideoPlayer(Phonon::VideoCategory,widget);player->load(Phonon::MediaSource("../Puppet.mpg"));player->play();widget->show();returnapp.exec();}MediaObjectClassMediaObject類別主要提供一個能夠處理媒體播放的介面。MediaObject可說是處理多媒體檔案最基本的一部份,它接受并管理來自於MediaSource的媒體檔案。而媒體播放、暫停與停止都是由它來控制;而在此之前,media物件必須要與outputnode連接,如早先所講的,這個nodes主要將媒體輸出至底層的硬體,例如音效卡或顯示卡等,而所需要的outputnode則是根據(jù)多媒體的內(nèi)容而所不同,目前Phonon有兩種outputnode;AudioOutput一聲音播放VideoWidget—影像播放如果MediaSource包含聲音與影像的話,這兩種node都必須要連接至media物件。就這個類別來說,有幾個函式是你必須要知道的,分別是setCurrentSource():設(shè)定MediaObject的多媒體來源,而來源可以是網(wǎng)路上的影音檔(利用QUrl來存取)或是本機檔案(利用QString),使用上相當(dāng)簡單:QUrlurl("/music.mp3”);//指定URL這里我是亂寫的URLmediaObject->setCurrentSource(url);.play():開始播放多媒體資料?pause():暫停播放.stop():停止播放以下為一個簡單的程式片段,說明如何使用:Phonon::MediaObject*mediaObject=newPhonon::MediaObject(this);Phonon::VideoWidget*videoWidget=newPhonon::VideoWidget(this);Phonon::createPath(mediaObject,videoWidget);Phonon::AudioOutput *audioOutput =newPhonon::AudioOutput(Phonon::VideoCategory,this);Phonon::createPath(mediaObject,audioOutput);mediaObject->play();Phonon::createPath()這是相當(dāng)重要的一個函數(shù),主要用於建立一個Path,連接兩個MediaNodes,就是source與sink。其實它的主要用途是在更進階的部分,就是在使用到mediagraph,不過如果只是利用Phonon來播放多媒體影音檔,其實只要記得它是用來連接source與輸出裝置即可。AudioOutputClassAudioOutput類別主要是用來把多媒體的聲音送到聲音輸出裝置。所以它能夠經(jīng)由類似喇叭等輸出裝置來播放聲音,稍早有提過,多媒體資料的來源必須要經(jīng)過Phonon::createPath()由MediaObject連接。Phonon::MediaObject*mediaObject=newPhonon::MediaObject(this);mediaObject->setCurrentSource(Phonon::MediaSource("E:/hello.mp3"));Phonon::AudioOutput *audioOutput =newPhonon::AudioOutput(Phonon::MusicCategory,this);Phonon::Pathpath=Phonon::createPath(mediaObject,audioOutput);VideoWidgetClassVideoWidget類別提供能夠顯示出影片的widget,即視頻的顯示主窗口,沒有VideoWidget則可能造成有聲音無圖像的情況。VideoWidget類別會在QWidget上播放多媒體串流的影像,跟AudioOutput一樣,必須使用Phonon::createPath()來與MediaObject連接。你可以利用一些函數(shù)來控制在QWidget中的VideoWidget顯示的大小,你可以利用setAspectRatio()或setScaleMode()來控制,而它們接收的參數(shù)可以到網(wǎng)站上察看,使用方式如下(預(yù)設(shè)是使用aspectratio):videowidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);videowidget->setScaleMode(Phonon::VideoWidget::ScaleAndCrop);當(dāng)然也有提供函式讓影片進入或退出全螢?zāi)荒J健R韵聻橐粋€簡短的程式碼范例:MediaObject*mediaObject=newMediaObject(parent);VideoWidget *vWidget = newVideoWidget(parent);Phonon::createPath(mediaObeject,vWidget);SeekSliderClassSeekSlider類別提供一個可滑動的slider來設(shè)定多媒體串流播放的位置,即播放進度條,所以它會連接到MediaObject,并控制串流目前的位置。以下是一個使用的范例:Phonon::MediaObject*mediaObject=newPhonon::MediaObject;Phonon::AudioOutput*audioOutput=newPhonon::AudioOutput;Phonon::createPath(mediaObject,audioOutput);mediaObject->setCurrentSource(QString("E:/hello.avi"));Phonon::SeekSlider*seekSlider=newPhonon::SeekSlider;seekSlider->setMediaObject(mediaObject);//與媒體對象mediaObject進行關(guān)聯(lián)seekSlider->show();mediaObject->play();VolumeSliderClassVolumeSliderwidget提供可以控制聲音裝置音量的widget。用法其實與上面的SeekSlider類似,使用范例如下:Phonon::AudioOutput *audioOutput =newPhonon::AudioOutput(Phonon::MusicCategory);Phonon::createPath(mediaObject,audioOutput);Phonon::VolumeSlider*volumeSlider=newPhonon::VolumeSlider;volumeSlider->setAudioOutput(audioOutput);//與音頻輸出設(shè)備進行關(guān)聯(lián)簡單范例再看過上面的一些類別介紹之彳麥,其實就可以顯一個簡單的媒體播放器了,代碼如下:#include<QApplication>#include<QWidget>#include<phonon>#include<QUrl>#include<QObject>#include<QVBoxLayout>#include<QHBoxLayout>#include<QLabel>intmain(intargc,char*argv[])(□Applicationapp(argc,argv);QWidget*mainWidget=newQWidget;mainWidget->setWindowTitle("MediaPlayer");mainWidget->resize(640,480);Phonon::MediaObject*mediaObject=newPhonon::MediaObject;//媒體對象mediaObject->setCurrentSource(Phonon::MediaSource("E:/hello.avi"));Phonon::VideoWidget*videoWidget=newPhonon::VideoWidget;//影像窗口Phonon::createPath(mediaObject,videoWidget);videoWidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);Phonon::AudioOutput *audioOutput =newPhonon::AudioOutput(Phonon::VideoCategory);//音頻輸出Phonon::createPath(mediaObject,audioOutput);QLabel*label=newQLabel("Volume:");Phonon::VolumeSlider*volumeSlider=newPhonon::VolumeSlider;volumeSlider->setAudioOutput(audioOutput);volumeSlider->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);Phonon::SeekSlider*seekSlider=newPhonon::SeekSlider;seekSlider->setMediaObject(mediaObject);//布局管理將上述所有控件添加到主窗口中即mainWidgetQHBoxLayout*hLayout=newQHBoxLayout;hLayout->addWidget(label);hLayout->addWidget(volumeSlider);hLayout-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論