freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于linux的音樂(lè)播放器設(shè)計(jì)與實(shí)現(xiàn)論文(編輯修改稿)

2025-07-15 14:19 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 射時(shí),這些槽將會(huì)一個(gè)接一個(gè)地 執(zhí)行,但是它們執(zhí)行的順序?qū)?huì)是隨機(jī)的、不確定的,我們不能人為地指定哪個(gè)先執(zhí)行,哪個(gè)后執(zhí)行。信號(hào)的聲明是在頭文件中進(jìn)行的,QT 的 signals 關(guān)鍵字指出進(jìn)入了信號(hào)聲明區(qū),隨后即可 聲明自己的信號(hào)。例如,下面定義了兩個(gè)信號(hào):signals: void mySignal()。 void mySignal(int x)。 在上面的定義中,signals 是 QT 的關(guān)鍵字,而非 C/C++ 的。接下來(lái)的一行void mySignal() 定義了信號(hào)mySignal,這個(gè)信號(hào)沒(méi)有攜帶參數(shù);接下來(lái)的一行void mySignal(int x) 定義了重名信號(hào) mySignal,但是它攜帶一個(gè)整形參數(shù),這有點(diǎn)類(lèi)似于 C++ 中的虛函數(shù)。從形式上講信號(hào)的聲明與普通的C++函數(shù)是一樣的,但是信號(hào)卻沒(méi)有函數(shù)體定義。另外,信號(hào)的返回類(lèi)型都是void,不要指望能從信號(hào)返回什么有用信息。信號(hào)由moc自動(dòng)產(chǎn)生,[6]。 槽槽是普通的 C++ 成員函數(shù),可以被正常調(diào)用,它們唯一的特殊性就是很多信號(hào)可以與其相關(guān)聯(lián)。當(dāng)與其關(guān)聯(lián)的信號(hào)被發(fā)射時(shí),這個(gè)槽就會(huì)被調(diào)用。槽可以有參數(shù),但槽的參數(shù)不能有缺省值。既然槽是普通的成員函數(shù),因此與其它的函數(shù)一樣,它們也有存取權(quán)限。槽的存取權(quán)限決定了誰(shuí)能夠與其相關(guān)聯(lián)。同普通的 C++ 成員函數(shù)一樣,槽函數(shù)也分為三種類(lèi)型,即 public slots、private slots 和 protected slots。(1) public slots類(lèi)型。在這個(gè)區(qū)內(nèi)聲明的槽意味著任何對(duì)象都可將信號(hào)與之相連接。這對(duì)于組件編程非常有用,你可以創(chuàng)建彼此互不了解的對(duì)象,將它們的信號(hào)與槽進(jìn)行連接以便信息能夠正確的傳遞。(2) protected slots類(lèi)型。在這個(gè)區(qū)內(nèi)聲明的槽意味著當(dāng)前類(lèi)及其子類(lèi)可以將信號(hào)與之相連接。這適用于那些槽,它們是類(lèi)實(shí)現(xiàn)的一部分,但是其界面接口卻面向外部。(3) private slots類(lèi)型。在這個(gè)區(qū)內(nèi)聲明的槽意味著只有類(lèi)自己可以將信號(hào)與之相連接。這適用于聯(lián)系非常緊密的類(lèi)。槽也能夠聲明為虛函數(shù),這也是非常有用的。槽的聲明也是在頭文件中進(jìn)行的。例如,下面聲明了兩個(gè)槽:public slots: void mySlot()。 void mySlot(int x)。 在上面的定義中,slots是 QT 的關(guān)鍵字。接下來(lái)的一行void mySlot() 定義了槽mySlot,這個(gè)槽沒(méi)有攜帶參數(shù);接下來(lái)的一行void mySlot(int x)定義了重名槽 mySlot,但是它攜帶一個(gè)整形參數(shù)。槽的返回類(lèi)型都是void。 信號(hào)與槽的關(guān)聯(lián)信號(hào)是一個(gè)特定的標(biāo)識(shí),槽就是一個(gè)函數(shù),卻與一般函數(shù)不同,槽函數(shù)能和信號(hào)關(guān)聯(lián),也能夠被直接調(diào)用。Qt利用信號(hào)與槽(signals/slots)機(jī)制取代傳統(tǒng)的callback來(lái)進(jìn)行物件之間的溝通。當(dāng)操作事件發(fā)生的時(shí)候,物件會(huì)發(fā)送出一個(gè)信號(hào)(signal);而槽(slot)則是一個(gè)函式接受特定信號(hào)并且執(zhí)行槽本身設(shè)定的動(dòng)作。在程序中,使用QObject::connect()函數(shù)來(lái)將信號(hào)與槽關(guān)聯(lián)。信號(hào)與槽的關(guān)聯(lián)關(guān)系有以下幾種模式:(1) 一個(gè)信號(hào)和槽關(guān)聯(lián)。(2) 一個(gè)信號(hào)和多個(gè)槽關(guān)聯(lián)。(3) 多個(gè)信號(hào)和一個(gè)槽關(guān)聯(lián)。一個(gè)信號(hào)與多個(gè)槽關(guān)聯(lián)的情況下,當(dāng)發(fā)出信號(hào)的時(shí)候,與此信號(hào)關(guān)聯(lián)的各個(gè)槽之間以任意的先后順序立即執(zhí)行,即:槽函數(shù)之間的執(zhí)行順序是隨機(jī)的,與信號(hào)和槽關(guān)聯(lián)的先后沒(méi)有關(guān)系。同時(shí),信號(hào)和槽機(jī)制是完全和GUI事件完全獨(dú)立的,槽函數(shù)獨(dú)立循環(huán)。信號(hào)在任何執(zhí)行點(diǎn)上皆可發(fā)射,甚至可以在槽里再發(fā)射另一個(gè)信號(hào),信號(hào)與槽的連結(jié)不限定為一對(duì)一的連結(jié),一個(gè)信號(hào)可以連結(jié)到多個(gè)槽或多個(gè)信號(hào)連結(jié)到同一個(gè)槽,甚至信號(hào)也可連接到信號(hào)。 Qt信號(hào)和槽機(jī)制的優(yōu)點(diǎn)信號(hào)和槽機(jī)制有以下優(yōu)點(diǎn)[10]:(1) 類(lèi)型安全的。以往的callback缺乏類(lèi)型安全,在呼叫處理函數(shù)時(shí),無(wú)法確定是傳遞正確型態(tài)的參數(shù)。信號(hào)和其接受的槽之間傳遞的資料型態(tài)必須要相符合,需要關(guān)聯(lián)的信號(hào)和槽的簽名必須是等同的,即信號(hào)的參數(shù)類(lèi)型和參數(shù)個(gè)數(shù)與接受該信號(hào)的槽的參數(shù)類(lèi)型和參數(shù)個(gè)數(shù)相同;不過(guò),一個(gè)槽的參數(shù)個(gè)數(shù)是可以少于信號(hào)的參數(shù)個(gè)數(shù),但缺少的參數(shù)必須是信號(hào)參數(shù)的最后一個(gè)或幾個(gè)參數(shù)。如果信號(hào)和槽的簽名不符,編譯器會(huì)報(bào)錯(cuò)。信號(hào)和槽可接受任何數(shù)量、任何型態(tài)的參數(shù),所以信號(hào)與槽機(jī)制是完全類(lèi)型安全。(2) 松散耦合的。Qt信號(hào)和槽機(jī)制減弱了Qt對(duì)象的耦合度。激發(fā)信號(hào)的Qt對(duì)象無(wú)需知道是哪個(gè)對(duì)象的哪個(gè)槽需要接收它發(fā)出的信號(hào),它需要做的是在適當(dāng)?shù)臅r(shí)間發(fā)送適當(dāng)?shù)男盘?hào)就可以了,而不需要知道也不必關(guān)心它的信號(hào)有沒(méi)有被接收到,更不需要知道是哪個(gè)對(duì)象的哪個(gè)槽接收到了信號(hào),也就是說(shuō)一個(gè)信號(hào)可以呼叫所有可用的槽。同樣的,對(duì)象的槽也不知道是哪些信號(hào)關(guān)聯(lián)到了自己。而一旦關(guān)聯(lián)信號(hào)和槽,Qt就保證了合適的槽得到調(diào)用。即使關(guān)聯(lián)的對(duì)象在運(yùn)行時(shí)被刪除,應(yīng)用程序也不會(huì)出現(xiàn)崩潰。此機(jī)制會(huì)確保當(dāng)在“連接”信號(hào)和槽時(shí),槽會(huì)接受信號(hào)的參數(shù)并且正確執(zhí)行。(3) 信號(hào)與槽的效率問(wèn)題。信號(hào)和槽機(jī)制增強(qiáng)了對(duì)象間通信的靈活性,然而也損失了一些性能。與callback相比較,信號(hào)與槽有些慢。原因有:需要定位接受信號(hào)的對(duì)象;安全的遍歷所有的關(guān)聯(lián)(如:一個(gè)信號(hào)關(guān)聯(lián)到多個(gè)槽);多線(xiàn)程,信號(hào)可能排隊(duì)等待。但是,與創(chuàng)建堆對(duì)象時(shí)的new操作實(shí)例化對(duì)象,以及刪除堆對(duì)象的delete操作相比較,信號(hào)與槽的代價(jià)只是他的很少的一部分。信號(hào)和槽帶來(lái)的性能損耗,對(duì)實(shí)時(shí)應(yīng)用程序是很小的。相對(duì)于信號(hào)與槽帶來(lái)的靈活與簡(jiǎn)便,這點(diǎn)性能損失是可以接受的。 函數(shù)基于Linux的播放器使用了Phonon多媒體框架和Qt框架的相關(guān)函數(shù),現(xiàn)簡(jiǎn)要介紹如下。 Phonon媒體框架Phonon 有三個(gè)基本概念:媒體對(duì)象、接收端和路徑,圖31是Phonon架構(gòu)圖[7]:圖31 Phonon框架圖31是Phonon的架構(gòu)圖。Media Object(媒體對(duì)象)管理一個(gè)Media Source(媒體源),比如一個(gè)音樂(lè)文件;它提供了簡(jiǎn)單的播放控制,比如開(kāi)始、停止和暫停播放。Sink是輸出多媒體,通常是一個(gè)播放的裝置(如聲卡),且只接受MediaObject來(lái)的數(shù)據(jù)。多媒體由MediaObject控制播放,而由Sink來(lái)處理這些多媒體。Path是用來(lái)連接 Phonon對(duì)象的,比如,一個(gè)媒體對(duì)象和一個(gè)接收端,從而構(gòu)成了Phonon 中的MediaGraph,如圖32所示:圖32 媒體文件播放過(guò)程圖32是媒體文件的播放過(guò)程,這些在不同的系統(tǒng)中實(shí)現(xiàn)方式不同,如:在Linux環(huán)境下,通常使用GStreamer庫(kù),在Max OS X 環(huán)境下,使用QuickTime,在windows下,使用Direct X和SirectShow庫(kù)。而Qt中的phonon作為跨平臺(tái)的多媒體解決方案,就應(yīng)該為用戶(hù)屏蔽掉這些差異,如圖33所示:圖33 詳細(xì)Phonon框架圖33是Phonon的詳細(xì)框架圖,由圖可知Phonon框架實(shí)質(zhì)上分4個(gè)部分:程序、Phonon庫(kù)、Phonon后端插件(phonon_backend)、真正的后端。Phonon其實(shí)什么都不干,他只是提供了一套API接口,這套接口可以給你的程序調(diào)用,同時(shí)也是給編寫(xiě)后端插件提供一個(gè)規(guī)范。同樣,Phonon庫(kù)也不知道,他只管搜索符合自己規(guī)范的插件。并告訴這些插件,現(xiàn)在程序發(fā)出的指令是什么,從插件返回給程序現(xiàn)在的媒體狀態(tài)和信息。而后端才是實(shí)際進(jìn)行讀入媒體、解碼并且播放的部分,他們和后端插件是一一對(duì)應(yīng)的。后端可以是任何形式,只要你寫(xiě)出了相應(yīng)的后端插件。Phonon函數(shù)成員如圖34所示[7]:圖34 主要的Phonon類(lèi)播放器主要使用的Phonon類(lèi)及使用方法介紹如下[11]:(1) Phonon::MediaObject ClassMediaObject主要提供一個(gè)能夠處理媒體播放的類(lèi)。MediaObject可說(shuō)是處理多媒體文件最基本的一部份,它接受并管理來(lái)自于MediaSource的媒體文件。而媒體播放、暫停與停止都是由它來(lái)控制;而在此之前,mediaObject必須要與output node連接,如早先所講的,這個(gè)nodes主要將媒體輸出至底層的硬件,例如聲卡或顯卡等,而所需要的output node則是根據(jù)多媒體的內(nèi)容而所不同,目前Phonon有兩種output node: AudioOutput-聲音播放。 VideoWidget-影像播放。用法:Phonon::MediaObject *mediaObject=new Phonon::MediaObject(this)。mediaObjectsetCurrentSource(Phonon::MediaSource(/mymusic/))。(2) Phonon::AudioOutput Class AudioOutput類(lèi)別主要是用來(lái)把多媒體的聲音送到聲音輸出裝置。所以它能夠經(jīng)由類(lèi)似喇叭等輸出裝置來(lái)播放聲音,多媒體資料的來(lái)源必須要經(jīng)過(guò)Phonon::createPath()與MediaObject連接。在Phonon術(shù)語(yǔ)中,我們要?jiǎng)?chuàng)建的AudioOutput對(duì)象叫做音頻接收槽。它是直接與音頻驅(qū)動(dòng)器通信的層的組成部分,并充當(dāng)MediaObject的虛擬音頻設(shè)備。MediaObject位于這一層的上層,增加了諸如暫停、播放和倒帶之類(lèi)的功能。用法:AudioOutput *audioOutput=new AudioOutput(Phonon::MusicCategory, this)。(3) Phonon::createPath()這是相當(dāng)重要的一個(gè)函數(shù),主要用于建立一個(gè)Path,連接兩個(gè)MediaNodes,就是Source與Sink。如果只是利用Phonon來(lái)播放多媒體影音文件,其實(shí)只要記得它是用來(lái)連接source與輸出裝置即可。用法:Phonon::Path path=Phonon::createPath(mediaObject, audioOutput)。(4) Phonon::SeekSlider classSeekSlider類(lèi)別提供一個(gè)可滑動(dòng)的slider來(lái)設(shè)定多媒體串流播放的位置。所以它會(huì)連接到MediaObject,并控制串流目前的位置。用法:Phonon::SeekSlider *seekSlider = new Phonon::SeekSlider(this)。seekSlider setMediaObject(mediaObject)。seekSlider show()。(5) Phonon::VolumeSlider ClassVolumeSlider提供可以控制聲音裝置音量的類(lèi)。用法其實(shí)與上面的SeekSlider類(lèi)似,使用范例如下:Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider。volumeSlidersetAudioOutput(audioOutput)。 Qlist容器類(lèi)QList不是Phonon的類(lèi)成員,而是Qt的一個(gè)類(lèi)庫(kù),它是一種表示鏈表的模板類(lèi)。QlistT是Qt的一種泛型容器類(lèi)。它以鏈表方式存儲(chǔ)一組值,并能對(duì)這組數(shù)據(jù)進(jìn)行快速索引,還提供了快速插入和刪除等操作。QListT是一組指向被存儲(chǔ)元素的數(shù)組。元素個(gè)數(shù)小于1000的QList能夠很快地實(shí)現(xiàn)在鏈表中間插入操作,以及快速的查找操作。此外,由于QList在鏈表兩端都預(yù)先分配了緩存以應(yīng)對(duì)鏈表兩端的快速添加操作,這樣就使得在QList的兩端插入或刪除元素變得非常迅速。很適合使用Qlist來(lái)存儲(chǔ)播放器的播放列表,用法:QListPhonon::MediaSource sourceList。 播放器的基本功能在使用Phonon多媒體框架前,需要在項(xiàng)目額外設(shè)定使用Phonon模組,必須要在qmaek project file()中加入:QT += phonon,將Phonon庫(kù)添加進(jìn)項(xiàng)目[6]。 建立媒體對(duì)象 首先實(shí)例化使用的Phonon類(lèi):mediaObject =new Phonon::MediaObje
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1