[Qt教程] 第49篇 進階(九) 多媒體應用簡介
樓主
發表於 2013-10-7 09:50:36 | 查看:
267| 回複: 2

多媒體應用簡介
版權聲明
該文章原創於作者yafeilinux,轉載請注明出處!
導語
Qt對於音頻視頻的播放和控製等多媒體應用提供了強大的支持。要想使計算機發出響聲,最簡單的方法是調用QApplication::beep()靜態函數;而對於簡單的聲音播放,可以使用 QSound類;對於簡單的動畫播放,可以使用QMovie類;要想對音頻視頻實現更多的控製,可以使用Phonon多媒體框架;而對於音頻視頻底層的控製,可以使用QtMultimedia模塊。
雖然在Qt 5中已經已經放棄了Phonon,但是使用Qt 4時,Phonon還是一個很好的選擇,所以這裏我們也對其進行了簡單介紹。
環境:Windows Xp + Qt 4.8.5+QtCreator2.8.0
目錄
一、使用QSound播放聲音
二、Phonon 簡介
三、使用Phonon播放音頻
四、使用Phonon播放視頻
正文
一、使用QSound播放聲音
1.新建Qt Gui應用,名稱為“mySound”,類名“MainWindow”和基類QMainWindow保持默認即可。
2.完成後在mainwindow.cpp文件中添加頭文件#include <QSound>,然後在構造函數中添加如下一行代碼:
QSound::play("../mySound/sound.wav");
這時運行程序就可以播放指定的音頻文件了,注意這裏將音頻文件放在了項目目錄中。因為現在QSound並不支持資源文件,所以音頻文件必須要放在程序外麵。除了簡單的使用靜態函數進行播放外,也可以先構建一個QSound對象,然後再調用play()槽進行播放,可以使用stop()槽來停止聲音的播放,還可以使用setLoops()函數設置播放重複的次數,如果設置為-1表示無限循環。
3.先到mainwindow.h文件中添加前置聲明classQSound;然後聲明一個私有對象:
QSound *sound;
再到mainwindow.cpp文件中,將構造函數裏添加的調用play()函數的代碼更改為:
sound = new QSound("../mySound/sound.wav", this);
然後我們雙擊mainwindow.ui文件進入設計模式,向界麵上添加兩個Push Button和一個Spin
Box,並將兩個按鈕的文本分別改為“播放”和“停止”。然後更改Spin Box的屬性,
將最小值minimum設置為-1,將當前值value設置為1。最後分別轉到兩個按鈕的clicked()槽和Spin
Box的valueChanged(int )槽,更改它們的內容如下:
void MainWindow::on_pushButton_clicked()
{ // 播放按鈕
sound->play();
}
void MainWindow::on_pushButton_2_clicked()
{ // 停止按鈕
sound->stop();
}
void MainWindow::on_spinBox_valueChanged(int
value)
{
sound->setLoops(value);
}
4.現在運行程序,可以設置播放的次數,然後使用開始按鈕進行播放,使用停止按鈕來停止播放了。要說明一下,在Windows平台上,如果設置了循環次數,那麼stop()函數無法立即停止播放,需要完成當前的循環才可以停止播放。
使用QSound可以實現一些簡短的聲音的播放,使用它來實現單擊按鈕或者其他事件的音效是很好的選擇。根據平台的音頻設備的不同,如果使用QSound同時播放多個音頻文件,那麼後麵播放的聲音或者會與前麵播放的聲音進行混合,或者會停止前麵播放的聲音,在Windows平台上,新播放的聲音會停止前麵播放的聲音。如果要播放其他格式的音頻文件,或者需要對播放進行更多的控製,那麼就需要使用Phonon多媒體框架來實現了。
二、Phonon 簡介
Phonon包含三個基本的概念:媒體對象(Media Objects)、匯點(Sinks)和路徑(Paths)。媒體對象是MediaObject類的一個實例,用來管理媒體源,例如一個音樂文件,它提供開始、停止和暫停等簡單的播放控製功能;匯點用來從Phonon中輸出媒體,例如在部件上渲染視頻或者將音頻傳送到聲卡,匯點通常是一個渲染設備,如VideoWidget;路徑用來連接Phonon對象,例如連接一個媒體對象和一個匯點,這樣形成的關係圖在Phonon中被稱為媒體圖(mediagraph)。下圖是一個音頻流的媒體圖:
![]() 下圖是一個播放帶有聲音的視頻文件的媒體圖:
![]() 多媒體功能並不是由Phonon本身實現的,而是由後端(也常被稱為引擎)實現的,這包含了連接、管理和驅動底層的硬件或中間技術。對於編程人員來說,這意味著媒體的節點,例如媒體對象、處理器和匯點,它們都由後端提供。而且,後端還負責構建媒體圖,例如連接各個節點。
Qt使用的後端,在Windows上是DirectShow,在Mac上是QuickTime,在Linux上是Gstreamer。依賴於底層的係統,在不同的平台上所提供的功能會有所不同。後端可以顯示頂層係統的信息,可以獲取它支持的媒體格式,例如AVI、mp3或者OGG等。
三、使用Phonon播放音頻
當播放音頻時,需要創建一個媒體對象,然後將它連接到一個音頻輸出節點,該節點由AudioOutput類提供,它用來將音頻輸出到聲卡。
1.新建Qt Gui應用,名稱為“myPhonon1”,類名“MainWindow”和基類QMainWindow保持默認即可。完成後,在項目文件myPhonon1.pro中添加如下一行代碼:
QT
+= phonon
然後保存該文件。
2.再到mainwindow.cpp文件中添加頭文件包含:
#include <phonon>
#include <QDebug>
#include <QUrl>
並在構造函數中添加如下代碼:
Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);
mediaObject->setCurrentSource(Phonon::MediaSource("../myPhonon1/mysong.mp3"));
Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon::Path path = Phonon::createPath(mediaObject,
audioOutput);
mediaObject->play();
AudioOutput類用來向音頻輸出設備發送數據,音頻輸出需要使用createPath()函數連接到媒體對象上。AudioOutput提供了函數來控製音量的大小,還可以設置靜音,而且Phonon還使用AudioOutput提供了一個音量控製部件VolumeSlider類,它是QWidget的子類。另外,Phonon中也提供了播放進度滑塊SeekSlider,該類也是QWidget的子類,它需要連接到媒體對象上。
3.往源碼目錄中添加一個mysong.mp3文件,運行程序就可以自動播放了。不過,現在還無法進行任何的控製。大家可以查看《Qt及Qt
Quick開發實戰精解》的音樂播放器實例,那是一個比較完整的播放器例子。
四、使用Phonon播放視頻
1.新建Qt Gui應用,項目名稱為“myPhonon2”,基類選擇QWidget,類名為“Widget”。完成後先到項目文件myPhonon2.pro中添加代碼:
QT
+= phonon
然後保存該文件。
2.播放視頻,可以使用VideoWidget類,該部件可以自動選擇可用的設備來播放視頻。VideoWidget並不會播放媒體流中的音頻,如果要播放視頻中的音頻,那麼就要創建一個AudioOutput節點。在mainwindow.cpp文件中添加頭文件包含:
#include <phonon>
#include <QAction>
#include <QVBoxLayout>
#include <QToolBar>
再在構造函數中添加如下代碼:
這裏創建了兩個路徑,分別用於視頻流和音頻流。創建VideoWidget時不需要指定類別,它會自動指定為VideoCategory類別,我們需要做的隻是確保AudioOutput也在同一個類別中。Phonon中的SeekSlider類提供了一個滑塊來定位媒體流,隻要與媒體對象MediaObject連接後,該部件就可以自動和媒體流的播放進度同步起來,不需要我們手動進行信號和槽的關聯。Phonon中的VolumeSlider部件提供了一個用來控製音頻輸出設備音量的滑塊,該滑塊還會默認顯示一個可以設置靜音的圖標,這個圖標可以使用setMuteVisible()來移除。
3.需要將一個myVideo.WMV的視頻文件複製到源碼目錄,然後運行程序,效果如下圖所示。
![]() 結語
Movie類是一個使用QImageReader來播放動畫的便捷類。該類用來顯示沒有聲音的簡單動畫,主要支持GIF和MNG格式的文件;在Qt 4.6中新加入了QtMultimedia模塊來提供一些底層的多媒體功能,比如音頻的采集和回放、頻譜分析、操作視頻幀等。關於這兩個類的使用,可以參考《Qt
Creator 快速入門》的第13章,進一步學習Phonon的內容,可以參考第14章。
涉及到的源碼: ![]() ![]() ![]() |
最後更新:2017-04-03 14:54:11