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;

 

 

 

   

 


  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 <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();
}
上面的程式码就完成了一个简易的多媒体播放器,当然还有很多部分还需要改进,不过在此仅就Phonon的使用上做介绍。执行之后的画面如下所示:
由於VideoWidget已经嵌入到QWidget了,所以你调整视窗大小的话,影片播放的视窗也会跟著调整。

时间: 2024-09-18 13:33:27

phonon的使用的相关文章

mediaobject-Qt phonon框架实现mp3边下边播

问题描述 Qt phonon框架实现mp3边下边播 写了一个音乐播放器,想要实现音乐搜索功能.思路是本地写个简单的服务器,然后将音乐传输到客户端,每传一些然后就播放一点于是去查API 发现Phonon框架包括MediaObject,Sink,Path.大概就是mediaObject的数据传到相应的硬件设备然后播放出来.而mediaObject的数据为mediaSource.因此去查mediaSource,发现其数据来源可以是本地mp3文件,或者url或者一个QIODevice.API中有个QBu

phonon mplayer-Qt如何构建phonon框架

问题描述 Qt如何构建phonon框架 在VS安装了Qt4.7,为什么使用phonon时提示说无法导出dll文件,是不是使用phonon时需要相关设置. 解决方案 Qt Phonon框架

qt4-Redhat下QT4.5.0安装Phonon mplayer

问题描述 Redhat下QT4.5.0安装Phonon mplayer 初学QT 请问QT怎么安装Phonon,我看网上的教程可我的文件夹没有phonon = = 安装好Phonon什么的,还要装什么吗? 完全不懂,虐死个喵 求详细步骤 解决方案 http://quarkplayer.googlecode.com/svn-history/r83/wiki/Building.wiki

使用Qt做一个简易音乐播放器[Phonon浅谈--续]

2010-2-13 使用Qt做一个简易音乐播放器[Phonon浅谈--续]   在第一篇Phonon浅谈中提及到了Phonon这个多媒体框架的一些基本知识,于是想着结合这些基本知识来实践一番,做一个简单的音乐播放器.   [步骤一] 新建一个Qt Gui工程,在建立过程中需要包含Phonon模块,之后生成文件如下图: Qt Gui工程会生成一个ui文件,在这里是mainwindow.ui.双击mainwindow.ui进行一番简单的布局,如下图: 关于这个ui界面,中央位置是一个QListWid

Phonon浅谈

Qt 使用 Phonon 这个多媒体框架来提供播放常见多媒体格式文件的功能,其中媒体文件可以是本地文件或者通过 QURL 指向的网络流文件. 在下面的概览中,会涉及到 Phonon 的主要概念.内部机制.核心 API 类以及如何使用这些 API 类.   [内部机制] Phonon 有三个基本概念:媒体对象.接收端和路径.一个媒体对象管理一个媒体源,比如一个音乐文件:它提供了简单的播放控制,比如开始.停止和暂停播放.一个接收端输出来自 Phonon 的媒体,比如,通过提供录像到一个窗口,或者通过

这样不行吗-Phonon中如何实现播放网络资源?

问题描述 Phonon中如何实现播放网络资源? 这样不行吗

Linux系统下使用Flacon导入CD音频文件中的歌曲

Linux系统下使用Flacon导入CD音频文件中的歌曲  Flacon 是一款 Qt 工具,用于从音频 CD 中提取个人曲目,基于在CUE文件中提供的信息提取如 WavPack. APE. FLAC. WAV 或 True Audio. 该应用程序提供了输出格式具体设置:你可以设置除 ReplayGain 以外的输出质量,压缩等,无论是每个专辑或音轨. Flacon 另外一个有用的功能就是标记导出的音轨文件,基于在CUE文件或手动提供的信息. 最新版本 Flacon 1.2.0 最近已经发布,

How To Compile Qt 4.7 with Visual Studio 2010

FEBRUARY 1, 2011 Usual way of installing Qt for Visual Studio is to download already compiled binaries from Nokia website. However binaries for the latest Visual Studio 2010 are not available (on the moment of the writing). This post is a step-by-ste

插件-linux下用Qt制作音乐播放器

问题描述 linux下用Qt制作音乐播放器 linux下用Qt制作音乐播放器时提示缺少插件phonon怎么解决,网上搜索了很多,但还是解决不了 解决方案 http://wenku.baidu.com/link?url=ek6Npa245WzZ2Z2vfWnc6at6m51_Wz0DUy74wK2JDPT5O4aZ_KBb3y6VTx8R-v64CZZPCF3y1qVqzu7cBDbsNgWPU-RgJfK5Y8EqrAAdUgu 解决方案二: http://download.csdn.net/d