前言
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�热荨�
整�w�碚f,Phonon的架��只需要�住以下的三�|西:
可�南�D看出彼此的�P�S(�Y料�碓矗�Phonon Overview):
所以整��播放影音的流程就是首先由media object�_始播放,接著把媒�w串流�由path送至sink,sink���由音效卡等�b置重新播放(play back)影音。
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。
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��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;
如果MediaSource包含�音�c影像的�,�@�煞Nnode都必�要�B接至media物件。
就�@����e�碚f,有���函式是你必�要知道的,分�e是
QUrl url("http://www.example.com/music.ogg"); media->setCurrentSource(url);
以下�橐����蔚某淌狡�段,�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();
�@是相��重要的一��函式,主要用於建立一��Path,�B接���MediaNodes,就是source�csink。
其��它的主要用途是在更�M�A的部分,就是在使用到media graph,不�^如果只是利用Phonon�聿シ哦嗝襟w影音�n,其��只要�得它是用�磉B接source�c�出�b置即可。
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��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��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 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站看哦。