天天看點

phonon的使用

如何使用 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 <QApplication>

#include <QWidget>

#include <phonon>

#include <QUrl>

int main(int argc, char *argv[]) {

     QApplication app(argc, argv);

     QWidget *widget = new QWidget;

<a></a>

<a href="http://writeblog.csdn.net/#"></a>

  widget-&gt;setWindowTitle("Video Player");

     widget-&gt;resize(400,400);

     Phonon::VideoPlayer *player = new Phonon::VideoPlayer(Phonon::VideoCategory, widget);

     player-&gt;load(Phonon::MediaSource("../Puppet.mpg"));

     player-&gt;play();

     widget-&gt;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),使用上相當簡單:

media-&gt;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-&gt;play();

Phonon::createPath()

這是相當重要的一個函數,主要用於建立一個Path,連接配接兩個MediaNodes,就是source與sink。

其實它的主要用途是在更進階的部分,就是在使用到media graph,不過如果隻是利用Phonon來播放多媒體影音檔,其實隻要記得它是用來連接配接source與輸出裝置即可。

AudioOutput Class

AudioOutput類别主要是用來把多媒體的聲音送到聲音輸出裝置。是以它能夠經由類似喇叭等輸出裝置來播放聲音,稍早有提過,多媒體資料的來源必須要經過Phonon::createPath()由MediaObject連接配接。

mediaObject-&gt;setCurrentSource(Phonon::MediaSource("/mymusic/barbiegirl.wav"));

          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-&gt;setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);

videowidget-&gt;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-&gt;setCurrentSource(

QString("/home/gvatteka/Music/Lumme-Badloop.ogg"));

Phonon::SeekSlider *slider = new Phonon::SeekSlider;

slider-&gt;setMediaObject(moo);

slider-&gt;show();

moo-&gt;play();

VolumeSlider Class

VolumeSlider widget提供可以控制聲音裝置音量的widget。

用法其實與上面的SeekSlider類似,使用範例如下:

honon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory);

Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider;

volumeSlider-&gt;setAudioOutput(audioOutput);

範例

再看過上面的一些類别介紹之後,其實就可以顯一個簡單的媒體播放器了,請看範例程式碼:

#include &lt;QObject&gt;

#include &lt;QVBoxLayout&gt;

#include &lt;QHBoxLayout&gt;

#include &lt;QLabel&gt;

     widget-&gt;setWindowTitle("Media Player");

     Phonon::MediaObject *media = new Phonon::MediaObject;

     media-&gt;setCurrentSource(Phonon::MediaSource("../Puppet.mpg"));

     Phonon::VideoWidget *vwidget = new Phonon::VideoWidget(widget);

     Phonon::createPath(media, vwidget);

     vwidget-&gt;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-&gt;setAudioOutput(aOutput);

     volumeSlider-&gt;setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);

     Phonon::SeekSlider *seekSlider = new Phonon::SeekSlider;

     seekSlider-&gt;setMediaObject(media);

     QHBoxLayout *hLayout = new QHBoxLayout;

     hLayout-&gt;addWidget(label);

     hLayout-&gt;addWidget(volumeSlider);

     hLayout-&gt;addStretch();

     QVBoxLayout *vLayout = new QVBoxLayout;

     vLayout-&gt;addWidget(vwidget);

     vLayout-&gt;addWidget(seekSlider);

     vLayout-&gt;addLayout(hLayout);

     widget-&gt;setLayout(vLayout);

     media-&gt;play();

上面的程式碼就完成了一個簡易的多媒體播放器,當然還有很多部分還需要改進,不過在此僅就Phonon的使用上做介紹。執行之後的畫面如下所示:

由於VideoWidget已經嵌入到QWidget了,是以你調整視窗大小的話,影片播放的視窗也會跟著調整。

繼續閱讀