QT Phonon详解

前言

Phonon�栏�碚f其��非��Qt的library,Phonon原本就是KDE 4的�_放原始�a多媒�wAPI,後�砼cQt合�闩c�_�l,所以���碚f就是Qt使用Phonon�@��多媒�w框架�硖峁┮话阌耙舳嗝襟w�n案的播放,而�@些影音多媒�w�碓纯梢允�n案、�W路串流或是指到一���n案的QUrl。

Phonon是一��跨平台多媒�w框架,能�蛟�Qt��用程式中使用�c播放影音多媒�w�热荨�

 

[��] Phonon的架��

整�w�碚f,Phonon的架��只需要�住以下的三�|西:

  • media object
    Phonon的基�A,用於管理多媒�w�碓础�碓纯赡苁怯耙�n等,而能�蛱峁┗�本的播放控制,例如�_始、�和;蚪Y束。而提供多媒�w�Y料�omedia object的�t��media source,在�omedia object之前通常是raw data,再由media object�M行�D�Q。
  • sinks
    �出多媒�w,例如在widget上播放影片或是�出至音效卡(播放音��)。通常sink是一��播放的�b置(例如音效卡等)。而sink只接受media object�淼馁Y料,由media object控制播放;而由sink�硖�理�@些多媒�w
  • paths
    用�磉B接Phonon的物件,意即media object�csink之�g的�B接。


可�南�D看出彼此的�P�S(�Y料�碓矗�Phonon Overview):

所以整��播放影音的流程就是首先由media object�_始播放,接著把媒�w串流�由path送至sink,sink���由音效卡等�b置重新播放(play back)影音。

 

[��] 安�b

QtSoftware官方�W站是�fPhonon�A�O��跟在安�bQt�r一�惆惭b,不�^我不�是��Qt SDK或��source code重新build,都�]有包含Phonon模�M,目前我是用另外一�N方式�戆惭bPhonon,就是使用套件管理工具��奶准�包�戆惭b,只需要安�b下列的套件:

sudo apt-get install libphonon-dev libphonon4 phononbackend-gstreamer

安�b完��之後,就可以使用Phono模�M�印�


而�c其他Qt��用程式一�樱�若有使用到Phonon函式�斓��用程式在build的�r候都需要�~外�O定使用Phonon模�M,必�要在qmaek project file中加入:

QT += phonon

 

[��] 使用

在此部分����_始介�B如何使用Phonon�@套函式�欤��K且��列出一些小�例��demo,首先就先�斫榻B�����魏糜玫念��e。

 

[��] VideoPlayer Class

Phonon有提供很多��e可供使用,其中最��蔚模�莫�^於VideoPlayer�@����e了。

VideoPlayer widget如它的名字一�樱�就是用�聿シ�video,而且使用起�硐喈��易,而且功能也不��缺少,包括播放、�和Ec停止。

而一�_始早先提到的MediaObject等��e�cVideoPlayer在使用上有什�N差��呢?如果不需要更�}�s的功能,例如建立一��media graph,你只需要能�虿シ庞耙�n案的�,其��使用VideoPlayer��e即可�_到你的要求。

而另外值得一提的就是,VideoPlayer大部分函式都是非同步,所以�d入media source�K不���R上播放多媒�w�n案,只有在呼叫函式play( )之後才��播放。

要怎�N使用�@����e呢? 其��相����危�下面就是程式�a片段:

VideoPlayer *player = new VideoPlayer(Phonon::VideoCategory, parentWidget);  player->play(url);

在���w化VideoPlayer��e物件�r,可以在constructor就�d入多媒�w�N��c要放在哪��widget中(即��parentWidget),而media source可以利用函式load()�磔d入或是在play()�r�d入,而�d入方式可直接��n案或是�木W路位址。


以下就是一����蔚挠耙舨シ殴δ苄〕淌剑�

#include <QApplication>  #include <QWidget>  #include <phonon>  #include <QUrl>     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��e主要提供一��能�蛱�理媒�w播放的介面。

MediaObject可�f是�理多媒�w�n案最基本的一部份,它接受�K管理�碜造�MediaSource的媒�w�n案。而媒�w播放、�和Ec停止都是由它�砜刂疲欢�在此之前,media物件必�要�coutput node�B接,如早先所�v的,�@��nodes主要�⒚襟w�出至底�拥挠搀w,例如音效卡或�@示卡等,而所需要的output node�t是根��多媒�w的�热荻�所不同,目前Phonon有�煞Noutput node;

  • AudioOutput-�音播放
  • VideoWidget-影像播放

如果MediaSource包含�音�c影像的�,�@�煞Nnode都必�要�B接至media物件。

就�@����e�碚f,有���函式是你必�要知道的,分�e是

  • setCurrentSource():�O定MediaObject的多媒�w�碓矗�而�碓纯梢允蔷W路上的影音�n(利用QUrl�泶嫒�)或是本�C�n案(利用QString),使用上相����危�
QUrl url("http://www.example.com/music.ogg");   media->setCurrentSource(url);
  • play():�_始播放多媒�w�Y料
  • pause():�和2シ�
  • stop():停止播放


以下�橐����蔚某淌狡�段,�f明如何使用:

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,�B接���MediaNodes,就是source�csink。

其��它的主要用途是在更�M�A的部分,就是在使用到media graph,不�^如果只是利用Phonon�聿シ哦嗝襟w影音�n,其��只要�得它是用�磉B接source�c�出�b置即可。

 

[��] AudioOutput Class

AudioOutput��e主要是用�戆讯嗝襟w的�音送到�音�出�b置。所以它能�蚪�由�似喇叭等�出�b置�聿シ怕�音,稍早有提�^,多媒�w�Y料的�碓幢仨�要��^Phonon::createPath()由MediaObject�B接。

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��e提供能�蝻@示出影片的widget。

VideoWidget��e��在QWidget上播放多媒�w串流的影像,跟AudioOutput一�樱�必�使用Phonon::createPath()�砼cMediaObject�B接。你可以利用一些函式�砜刂圃�QWidget中的VideoWidget�@示的大小,你可以利用setAspectRatio()或setScaleMode()�砜刂疲�而它��接收的��悼梢缘骄W站上察看,使用方式如下(�A�O是使用aspect ratio):

videowidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);  videowidget->setScaleMode(Phonon::VideoWidget::ScaleAndCrop);


��然也有提供函式�影片�M入或退出全�幕模式。以下�橐���短的程式�a�例:

MediaObject *media = new MediaObject(parent);  VideoWidget *vwidget = new VideoWidget(parent);  Phonon::createPath(media, vwidget);

 

[��] SeekSlider Class

SeekSlider��e提供一��可滑�拥�slider�碓O定多媒�w串流播放的位置。所以它���B接到MediaObject,�K控制串流目前的位置。

以下是一��使用的�例:

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提供可以控制�音�b置音量的widget。

用法其���c上面的SeekSlider�似,使用�例如下:

honon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory);  Phonon::createPath(mediaObject, audioOutput);     Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider;  volumeSlider->setAudioOutput(audioOutput);

 

[��] �例

再看�^上面的一些��e介�B之後,其��就可以�@一����蔚拿襟w播放器了,�看�例程式�a:

#include <QApplication>  #include <QWidget>  #include <phonon>  #include <QUrl>  #include <QObject>  #include <QVBoxLayout>  #include <QHBoxLayout>  #include <QLabel>     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();  }

上面的程式�a就完成了一���易的多媒�w播放器,��然�有很多部分�需要改�M,不�^在此�H就Phonon的使用上做介�B。�绦兄�後的��面如下所示:

 

由於VideoWidget已�嵌入到QWidget了,所以你�{整�窗大小的�,影片播放的�窗也��跟著�{整。

另外,其��本篇技�g文章比�^少著墨Signal&Slot的使用,也�S在下一篇��做介�B,或是�x者可以自行到官方�W站看哦。

 

你可能感兴趣的:(object,Class,qt,Path,Constructor,output)