Qt Phonon教程
前言
Phonon嚴格來說其實非為Qt的library,Phonon原本就是KDE 4的開放原始碼多媒體API,後來與Qt合併與開發,所以簡單來說就是Qt使用Phonon這個多媒體框架來提供一般影音多媒體檔案的播放,而這些影音多媒體來源可以是檔案、網路串流或是指到一個檔案的QUrl。
Phonon是一個跨平臺多媒體框架,能夠在Qt應用程式中使用與播放影音多媒體內容。
[編輯] Phonon的架構
整體來說,Phonon的架構只需要記住以下的三東西:
media object
Phonon的基礎,用於管理多媒體來源。來源可能是影音檔等,而能夠提供基本的播放控制,例如開始、暫停或結束。而提供多媒體資料給media object的則為media source,在給media object之前通常是raw data,再由media object進行轉換。
sinks
輸出多媒體,例如在widget上播放影片或是輸出至音效卡(播放音樂)。通常sink是一個播放的裝置(例如音效卡等)。而sink只接受media object來的資料,由media object控制播放;而由sink來處理這些多媒體
paths
用來連線Phonon的物件,意即media object與sink之間的連線。
可從下圖看出彼此的關係(資料來源:Phonon Overview):
所以整個播放影音的流程就是首先由media object開始播放,接著把媒體串流經由path送至sink,sink會經由音效卡等裝置重新播放(play back)影音。
[編輯] 安裝
QtSoftware官方網站是說Phonon預設會跟在安裝Qt時一併安裝,不過我不論是從Qt SDK或從source code重新build,都沒有包含Phonon模組,目前我是用另外一種方式來安裝Phonon,就是使用套件管理工具來從套件包來安裝,只需要安裝下列的套件:
sudo apt-get install libphonon-dev libphonon4 phononbackend-gstreamer安裝完畢之後,就可以使用Phono模組囉。
而與其他Qt應用程式一樣,若有使用到Phonon函式庫的應用程式在build的時候都需要額外設定使用Phonon模組,必須要在qmaek project file中加入:
QT += phonon
[編輯] 使用
在此部分將會開始介紹如何使用Phonon這套函式庫,並且會列出一些小範例來demo,首先就先來介紹幾個簡單好用的類別。
[編輯] VideoPlayer Class
Phonon有提供很多類別可供使用,其中最簡單的,莫過於VideoPlayer這個類別了。
VideoPlayer widget如它的名字一樣,就是用來播放video,而且使用起來相當簡易,而且功能也不會缺少,包括播放、暫停與停止。
而一開始早先提到的MediaObject等類別與VideoPlayer在使用上有什麼差異呢?如果不需要更複雜的功能,例如建立一個media graph,你只需要能夠播放影音檔案的話,其實使用VideoPlayer類別即可達到你的要求。
而另外值得一提的就是,VideoPlayer大部分函式都是非同步,所以載入media source並不會馬上播放多媒體檔案,只有在呼叫函式play( )之後才會播放。
要怎麼使用這個類別呢? 其實相當簡單,下面就是程式碼片段:
VideoPlayer *player = new VideoPlayer(Phonon::VideoCategory, parentWidget);
player->play(url);在實體化VideoPlayer類別物件時,可以在constructor就載入多媒體種類與要放在哪個widget中(即為parentWidget),而media source可以利用函式load()來載入或是在play()時載入,而載入方式可直接從檔案或是從網路位址。
以下就是一個簡單的影音播放功能小程式:
#include
#include
#include
#include
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget *widget = new QWidget;
widget->setWindowTitle("Video Player");
widget->resize(400,400);
Phonon::VideoPlayer *player = new Phonon::VideoPlayer(Phonon::VideoCategory, widget);
player->load(Phonon::MediaSource("../Puppet.mpg"));
player->play();
widget->show();
return app.exec();
}
[編輯] MediaObject Class
MediaObject類別主要提供一個能夠處理媒體播放的介面。
MediaObject可說是處理多媒體檔案最基本的一部份,它接受並管理來自於MediaSource的媒體檔案。而媒體播放、暫停與停止都是由它來控制;而在此之前,media物件必須要與output node連線,如早先所講的,這個nodes主要將媒體輸出至底層的硬體,例如音效卡或顯示卡等,而所需要的output node則是根據多媒體的內容而所不同,目前Phonon有兩種output node;
AudioOutput-聲音播放
VideoWidget-影像播放
如果MediaSource包含聲音與影像的話,這兩種node都必須要連線至media物件。
就這個類別來說,有幾個函式是你必須要知道的,分別是
setCurrentSource():設定MediaObject的多媒體來源,而來源可以是網路上的影音檔(利用QUrl來存取)或是本機檔案(利用QString),使用上相當簡單:
QUrl url("http://www.example.com/music.ogg");
media->setCurrentSource(url);play():開始播放多媒體資料
pause():暫停播放
stop():停止播放
以下為一個簡單的程式片段,說明如何使用:
Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);
Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget(this);
Phonon::createPath(mediaObject, videoWidget);
Phonon::AudioOutput *audioOutput =
new Phonon::AudioOutput(Phonon::VideoCategory, this);
Phonon::createPath(mediaObject, audioOutput);
mediaObject->play();
[編輯] Phonon::createPath()
這是相當重要的一個函式,主要用於建立一個Path,連線兩個MediaNodes,就是source與sink。
其實它的主要用途是在更進階的部分,就是在使用到media graph,不過如果只是利用Phonon來播放多媒體影音檔,其實只要記得它是用來連線source與輸出裝置即可。
[編輯] AudioOutput Class
AudioOutput類別主要是用來把多媒體的聲音送到聲音輸出裝置。所以它能夠經由類似喇叭等輸出裝置來播放聲音,稍早有提過,多媒體資料的來源必須要經過Phonon::createPath()由MediaObject連線。
Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);
mediaObject->setCurrentSource(Phonon::MediaSource("/mymusic/barbiegirl.wav"));
Phonon::AudioOutput *audioOutput =
new Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon::Path path = Phonon::createPath(mediaObject, audioOutput);
[編輯] VideoWidget Class
VideoWidget類別提供能夠顯示出影片的widget。
VideoWidget類別會在QWidget上播放多媒體串流的影像,跟AudioOutput一樣,必須使用Phonon::createPath()來與MediaObject連線。你可以利用一些函式來控制在QWidget中的VideoWidget顯示的大小,你可以利用setAspectRatio()或setScaleMode()來控制,而它們接收的引數可以到網站上察看,使用方式如下(預設是使用aspect ratio):
videowidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
videowidget->setScaleMode(Phonon::VideoWidget::ScaleAndCrop);
當然也有提供函式讓影片進入或退出全螢幕模式。以下為一個簡短的程式碼範例:
MediaObject *media = new MediaObject(parent);
VideoWidget *vwidget = new VideoWidget(parent);
Phonon::createPath(media, vwidget);
[編輯] SeekSlider Class
SeekSlider類別提供一個可滑動的slider來設定多媒體串流播放的位置。所以它會連線到MediaObject,並控制串流目前的位置。
以下是一個使用的範例:
Phonon::MediaObject *moo = new Phonon::MediaObject;;
Phonon::AudioOutput *device = new Phonon::AudioOutput;
Phonon::createPath(moo, device);
moo->setCurrentSource(
QString("/home/gvatteka/Music/Lumme-Badloop.ogg"));
Phonon::SeekSlider *slider = new Phonon::SeekSlider;
slider->setMediaObject(moo);
slider->show();
moo->play();
[編輯] VolumeSlider Class
VolumeSlider widget提供可以控制聲音裝置音量的widget。
用法其實與上面的SeekSlider類似,使用範例如下:
honon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory);
Phonon::createPath(mediaObject, audioOutput);
Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider;
volumeSlider->setAudioOutput(audioOutput);
[編輯] 範例
再看過上面的一些類別介紹之後,其實就可以顯一個簡單的媒體播放器了,請看範例程式碼:
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget *widget = new QWidget;
widget->setWindowTitle("Media Player");
widget->resize(400,400);
Phonon::MediaObject *media = new Phonon::MediaObject;
media->setCurrentSource(Phonon::MediaSource("../Puppet.mpg"));
Phonon::VideoWidget *vwidget = new Phonon::VideoWidget(widget);
Phonon::createPath(media, vwidget);
vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
Phonon::AudioOutput *aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
Phonon::createPath(media, aOutput);
QLabel *label = new QLabel("Volume: ");
Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider;
volumeSlider->setAudioOutput(aOutput);
volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
Phonon::SeekSlider *seekSlider = new Phonon::SeekSlider;
seekSlider->setMediaObject(media);
QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(label);
hLayout->addWidget(volumeSlider);
hLayout->addStretch();
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addWidget(vwidget);
vLayout->addWidget(seekSlider);
vLayout->addLayout(hLayout);
widget->setLayout(vLayout);
widget->show();
media->play();
return app.exec();
}上面的程式碼就完成了一個簡易的多媒體播放器,當然還有很多部分還需要改進,不過在此僅就Phonon的使用上做介紹。執行之後的畫面如下所示:
由於VideoWidget已經嵌入到QWidget了,所以你調整視窗大小的話,影片播放的視窗也會跟著調整。
另外,其實本篇技術文章比較少著墨Signal&Slot的使用,也許在下一篇會做介紹,或是讀者可以自行到官方網站看哦。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/lbsljn/archive/2009/12/13/4994722.aspx
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22785983/viewspace-662966/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Qt Creator系列教程QT
- [Android] Qt安卓教程(2):移植Qt到安卓AndroidQT安卓
- QT之qss教程-QSpinBoxQT
- [Android] Qt安卓教程(1): 從Qt5.1開始AndroidQT安卓
- Qt5.12配置OpenCV教程QTOpenCV
- QT開發快速入門-教程1:搭建QT開發環境QT開發環境
- Qt快速入門系列教程目錄QT
- Qt 介面美化教程 QSS QML Qt自繪方式優缺點對比QT
- 2021Qt打包釋出教程QT
- 什麼是qt,QT Creator, QT SDK, QT DesignerQT
- 《Qt MOOC系列教程》第一章第三節:容器QT
- qt呼叫js,js呼叫qtQTJS
- Qt:QT右鍵選單QT
- QT父子與QT物件deleteQT物件delete
- QTQT
- Qt入門(11)——Qt外掛QT
- Qt Creator匯入不同Qt版本QT
- Qt入門(12)——Qt國際化QT
- Qt入門(13)——Qt的呼叫退出QT
- Qt入門(20)——Qt模組簡介QT
- Qt - Qt Creator下載與安裝QT
- Qt FontQT
- Qt MetaTypeInterfaceQT
- PyQt教程——程式語言切換(Qt Linguist和pylupdate的使用)QTNGUI
- 【QT】 Qt多執行緒的“那些事”QT執行緒
- QT Creator/QT Designer佈局自適應QT
- 靜態編譯Qt5.4.1和Qt WebKit編譯QTWebKit
- qt亂碼QT
- Qt Creater 2QT
- QT中namespaceQTnamespace
- qt多文件QT
- Qt乾糧QT
- QT 播放 FLASHQT
- Qt undefined reference to ***QTUndefined
- Qt ——塞班之死QT
- Qt動畫框架QT動畫框架
- qt指南(轉)QT
- qt深入解析QT