Qt在圖形界面程序開發上確實具有相當重要的地位,很多軟件都是用Qt開發的比如autodesk的maya,Qt開發的圖形界面的確相當吸引人,至少比MFC漂亮(個人覺得),這也是我喜歡Qt的主要原因。
視頻文件的播放,實際上是四個過程。首先是文件的讀取,再將文件數據分流成視頻流和音頻流,之后分別進行解碼,最后輸出解碼數據,同步音頻視頻的輸出實現視頻的播放。這里利用Qt提供的Phonon庫實現一個簡單播放器,以供學習練手之用。播放器在功能上能夠播放視頻音頻文件,能夠調整進度和聲音大小,能夠記錄播放歷史,能夠截屏和全屏播放,並且啟動程序時會顯示進度和關於信息。視頻文件支持avi、rmvb、flv格式的文件,音頻文件支持mp3和wma格式。截屏后圖片保存為png格式。簡要介紹一下Phonon庫,下圖為Phonon的架構:

MediaObject :
Phonon的基礎,用於管理多媒體來源。來源可能是影音檔等,能夠提供基本的播放控制,例如開始、暫停或結束。而提供多媒體數據給MediaObject的則為media source,在給MediaObject之前通常是raw data,再由MediaObject進行轉換。
Sinks :
輸出多媒體,例如在widget上播放影片或是輸出至聲卡(播放音樂)。通常sink是一個播放的裝置(例如聲卡等)。而sink只接受MediaObject來的數據,由MediaObject控制播放;而由sink來處理這些多媒體
paths :
用來連接Phonon的對象,意即MediaObject與Sink之間的連接。
播放器的結構類圖如下:

一共定義了五個類,主類為Player類,即播放器主界面;ManageList類用於管理播放列表;FileProperty類為文件屬性窗口類;PathURI類為路徑選擇窗口類;WizardPage為關於窗口類,每個類的構造函數和析構函數這里我沒有列出來。Player類中的函數都是槽函數(private slots),Qt的一個特點就是信號和槽機制,將信號和對應需要執行的槽函數鏈接起來就能實現對事件的響應或者處理。Qt提供了兩種方法完成信號和槽的映射,一種是直接在Qt creator界面中添加信號和槽函數的映射關系,另一種則是在代碼中添加connect函數來實現。
其中Player類中的media成員指向一個播放器對象,完成文件讀取和分流的任務;vwidget指向播放界面,實現視頻的播放;aOutput指向音頻輸出,實現音頻的播放。volumeSlider指向音量控制控件,seekSlider指向播放進度控件。用createPath將media與vwidget鏈接起來,同樣再將media與aOutput鏈接起來,使用Phonon提供的函數,實現3個按鈕的功能,相當簡單~~
1 media = new Phonon::MediaObject; 2 vwidget = new Phonon::VideoWidget(ui->centralwidget); //播放器界面 3 Phonon::createPath(media,vwidget); 4 5 //設置可播放的文件類型 6 vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto); 7 aOutput = new Phonon::AudioOutput(Phonon::VideoCategory); 8 Phonon::createPath(media,aOutput); 9 volumeSlider = new Phonon::VolumeSlider; 10 volumeSlider->setAudioOutput(aOutput); 11 12 volumeSlider->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum); 13 seekSlider = new Phonon::SeekSlider; 14 seekSlider->setMediaObject(media);
1 void Player::on_pbPlay_clicked() 2 { 3 media->play(); 4 } 5 6 void Player::on_pbPause_clicked() 7 { 8 media->pause(); 9 } 10 11 void Player::on_pbStop_clicked() 12 { 13 media->stop(); 14 }
播放器主界面如圖所示,比較簡略,但效果還不錯:

可以看到,主界面由播放界面、3個按鈕、播放進度條、音頻條、菜單、播放列表組成,功能也是一目了然,作為一個小播放器已經完全足夠了。
菜單欄里主要功能有:1.File->(Open,OpenURI,Property,Exit)
2.Edit->(Screenshort,ClearList)
3.View->(FullScreen,NormalScreen,HideList)
4.Sound->(Increase,Decrease)
如果你想設置一個啟動畫面來顯示進度和一些啟動關於信息,則可以創建一個啟動窗口類,在主函數中實例化Player類的對象前,先實例化一個啟動窗口類,如圖所示,圖標是我隨便從網上找的一個圖,當進度條讀完后,關於窗口關閉,顯示播放器界面窗口。

main.cpp代碼如下:
1 #include <QtGui/QApplication> 2 #include <QTextCodec> 3 #include "player.h" 4 #include "wizardpage.h" 5 6 int main(int argc,char *argv[]) 7 { 8 QApplication a(argc,argv); 9 a.setApplicationName("VideoPlayer"); 10 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); 11 12 13 WizardPage pg; 14 pg.show(); 15 pg.processbar(); 16 17 Player w; 18 pg.close(); 19 20 w.show(); 21 return a.exec(); 22 }
完成播放器的設計后還不夠,僅僅這樣是不能播放任何東西的,因為還需要解碼器來解碼視頻,本程序是在linux下運行的,解碼器用的比較好的是Gstreamer,樓主用的centos 6.0,默認狀態下是沒有安裝任何解碼器的,有一個省事的辦法:centos一般都帶了一個影音播放工具,可以直接打開播放一個視頻,然后就會出現提示需要解碼器,接着點擊安裝,就會自動安裝相關的解碼器以及一些必要的插件了,下載安裝完成后再運行程序就能進行視頻音頻的播放了!Enjoy it~
project下載地址:https://code.google.com/p/system-in-view/downloads/detail?name=Player.zip&can=2&q=#makechanges 有的還需要修改,還可以添加許多功能,比如快進等。
