QT实验十多媒体程序实验.docx
《QT实验十多媒体程序实验.docx》由会员分享,可在线阅读,更多相关《QT实验十多媒体程序实验.docx(13页珍藏版)》请在冰豆网上搜索。
QT实验十多媒体程序实验
多媒体程序实验
使用到Phonon函数库的应用程序在build的时候都需要额外设定使用Phonon模块组,必须要在qmakeprojectfile中加入:
QT+=phonon
一、使用如下类的说明:
VideoPlayerClass
VideoPlayer大部分函数是非同步,所以载入mediasource并不会马上播放多媒体多媒体文件,只有在调用函数play()之后才会播放。
MediaObjectClass
MediaObject类别主要提供一个能够处理媒体播放的介面。
Phonon有两种outputnode:
●AudioOutput-声音播放
●VideoWidget-影像播放
如果MediaSource包含声音与影像的话,这两种node都必须要连接至media物件。
就这个类别来说,有几个函数必须要知道的,分别是:
●setCurrentSource():
设定MediaObject的多媒体来源,而来源可以是网络上的影音文件(利用QUrl来存取)或是本机多媒体文件(利用QString),使用上相当简单:
QUrlurl("
media->setCurrentSource(url);
●play():
开始播放多媒体资料
●pause():
暂停播放
●stop():
停止播放
Phonon:
:
createPath()
主要用于建立一个Path,连接两个MediaNodes,就是source与sink。
用途是在使用mediagraph时将会用到,不过如果只是利用Phonon来播放多媒体影音档,其实只要记得它是用来连接source与输出装置即可。
AudioOutputClass
AudioOutput类别主要是用来把多媒体的声音送到声音输出装置。
所以它能够经由类似喇叭等输出装置来播放声音,多媒体资料的来源必须要经过Phonon:
:
createPath()由MediaObject连接。
VideoWidgetClass
VideoWidget类别提供能够显示出影片的widget。
SeekSliderClass
SeekSlider类别提供一个可滑动的slider来设定多媒体字节流播放的位置。
所以它会连接到MediaObject,并控制字节流目前的位置。
VolumeSliderClass
VolumeSliderwidget提供可以控制声音装置音量的widget。
<1>制作简单的媒体播放器,代码:
#include
#include
#include
#include
#include
#include
#include
#include
intmain(intargc,char*argv[]){
QApplicationapp(argc,argv);
QWidget*widget=newQWidget;
widget->setWindowTitle("MediaPlayer");
widget->resize(400,400);
Phonon:
:
MediaObject*media=newPhonon:
:
MediaObject;
media->setCurrentSource(Phonon:
:
MediaSource("../Puppet.mpg"));
Phonon:
:
VideoWidget*vwidget=newPhonon:
:
VideoWidget(widget);
Phonon:
:
createPath(media,vwidget);
vwidget->setAspectRatio(Phonon:
:
VideoWidget:
:
AspectRatioAuto);
Phonon:
:
AudioOutput*aOutput=newPhonon:
:
AudioOutput(Phonon:
:
VideoCategory);
Phonon:
:
createPath(media,aOutput);
QLabel*label=newQLabel("Volume:
");
Phonon:
:
VolumeSlider*volumeSlider=newPhonon:
:
VolumeSlider;
volumeSlider->setAudioOutput(aOutput);
volumeSlider->setSizePolicy(QSizePolicy:
:
Maximum,QSizePolicy:
:
Maximum);
Phonon:
:
SeekSlider*seekSlider=newPhonon:
:
SeekSlider;
seekSlider->setMediaObject(media);
QHBoxLayout*hLayout=newQHBoxLayout;
hLayout->addWidget(label);
hLayout->addWidget(volumeSlider);
hLayout->addStretch();
QVBoxLayout*vLayout=newQVBoxLayout;
vLayout->addWidget(vwidget);
vLayout->addWidget(seekSlider);
vLayout->addLayout(hLayout);
widget->setLayout(vLayout);
widget->show();
media->play();
returnapp.exec();
}
上面的程序代码完成了一个简易的多媒体播放器。
二、增强功能的多媒体播放器设计
建立一个GUIapplication,选择基类mainwindow:
1)工程文件中添加:
QT+=phonon
2)main.cpp如下:
#include
#include"mainwindow.h"
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
QTextCodec:
:
setCodecForTr(QTextCodec:
:
codecForName("gbk"));
MainWindoww;
w.show();
returna.exec();
}
3)修改mainwindow.cpp如下:
#include"mainwindow.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
voidMainWindow:
:
chooseVideo()
{
QStringfilename=QFileDialog:
:
getOpenFileName(this,tr("选择视频"),"/",tr("Videos(*.mpeg*.avi*.wmv)"));
if(filename.isEmpty())
return;
stop();
//newAction->setEnabled(false);
//stopAction->setEnabled(false);
mediaObject->setCurrentSource(Phonon:
:
MediaSource(filename));
playOrPause();
}
MainWindow:
:
MainWindow(QWidget*parent)
:
QMainWindow(parent)
{
setWindowIcon(QIcon(":
/images/video.png"));
newAction=newQAction(tr("打开"),this);
QMenu*fileMenu=menuBar()->addMenu(tr("文件"));
fileMenu->addAction(newAction);
mediaObject=newPhonon:
:
MediaObject(this);//MediaObject用于对媒体流基本控制,如播放,暂停,停止等,通过读取MediaSource
audioOutput=newPhonon:
:
AudioOutput(Phonon:
:
VideoCategory,this);//播放声音
videoWidget=newPhonon:
:
VideoWidget(this);//影片播放
volumeSlider=newPhonon:
:
VolumeSlider(this);//声音进度条
seekSlider=newPhonon:
:
SeekSlider(this);//影片播放进度条
seekSlider->setMediaObject(mediaObject);//关联播放进度条到影片
volumeSlider->setAudioOutput(audioOutput);//关联声音控制条到影片
videoWidget->setAspectRatio(Phonon:
:
VideoWidget:
:
AspectRatioWidget);
volumeSlider->setSizePolicy(QSizePolicy:
:
Maximum,QSizePolicy:
:
Maximum);//设置音量最大
Phonon:
:
createPath(mediaObject,audioOutput);//建立一个Path,连接两个MediaNodes,就是source与sink
Phonon:
:
createPath(mediaObject,videoWidget);
setupActions();
setupUi();
//mediaObject->setCurrentSource(Phonon:
:
MediaSource("h:
/55.avi"));//设定MediaObject的多媒体来源
mediaObject->setTickInterval(1000);
timeLcd->display("00:
00");
}
MainWindow:
:
~MainWindow()
{
}
voidMainWindow:
:
setupActions()
{
playAction=newQAction(style()->standardIcon(QStyle:
:
SP_MediaPlay),tr("播放"),this);
playAction->setShortcut(tr("Ctrl+P"));
stopAction=newQAction(style()->standardIcon(QStyle:
:
SP_MediaStop),tr("停止"),this);
stopAction->setShortcut(tr("Ctrl+S"));
nextAction=newQAction(style()->standardIcon(QStyle:
:
SP_MediaSkipForward),tr("下一个"),this);
nextAction->setShortcut(tr("Ctrl+N"));
previousAction=newQAction(style()->standardIcon(QStyle:
:
SP_MediaSkipBackward),tr("上一个"),this);
previousAction->setShortcut(tr("Ctrl+R"));
fullScreenAction=newQAction(tr("全屏"),this);
fullScreenAction->setShortcut(tr("Ctrl+Enter"));
skipForwardAction=newQAction(style()->standardIcon(QStyle:
:
SP_MediaSkipForward),tr("快进"),this);
skipBackAction=newQAction(style()->standardIcon(QStyle:
:
SP_MediaSkipBackward),tr("快退"),this);
connect(newAction,SIGNAL(triggered()),this,SLOT(chooseVideo()));
connect(playAction,SIGNAL(triggered()),this,SLOT(playOrPause()));
connect(stopAction,SIGNAL(triggered()),mediaObject,SLOT(stop()));
connect(fullScreenAction,SIGNAL(triggered()),this,SLOT(fullOrNormalScreen()));
connect(mediaObject,SIGNAL(stateChanged(Phonon:
:
State,Phonon:
:
State)),this,SLOT(mediaStateChanged(Phonon:
:
State)));
connect(mediaObject,SIGNAL(tick(qint64)),this,SLOT(tick(qint64)));
}
voidMainWindow:
:
setupUi()
{
playStateLabel=newQLabel();
playStateLabel->setAlignment(Qt:
:
AlignLeft);
playStateLabel->setText(tr("准备就绪"));
timeLcd=newQLCDNumber();
timeLcd->setVisible(false);
timeLcd->setFixedSize(100,15);
playStateLabel->setFixedHeight(15);
QFontfont("Times",8);
playStateLabel->setFont(font);
QGridLayout*statusLayout=newQGridLayout;
statusLayout->addWidget(playStateLabel,0,0);
statusLayout->addWidget(timeLcd,0,3);
QToolBar*seekerBar=newQToolBar();
seekerBar->addAction(skipBackAction);
seekerBar->addWidget(seekSlider);
seekerBar->addAction(skipForwardAction);
seekerBar->setFixedHeight(20);
QVBoxLayout*seekerLayout=newQVBoxLayout;
seekerLayout->addWidget(seekerBar);
QToolBar*playControlBar=newQToolBar();
playControlBar->addAction(stopAction);
playControlBar->addAction(previousAction);
playControlBar->addAction(playAction);
playControlBar->addAction(nextAction);
playControlBar->addAction(fullScreenAction);
playControlBar->setFixedHeight(30);
QHBoxLayout*playControlLayout=newQHBoxLayout;
playControlLayout->addWidget(playControlBar);
playControlLayout->addWidget(volumeSlider);
QVBoxLayout*mainLayout=newQVBoxLayout;
mainLayout->addWidget(videoWidget);
mainLayout->addLayout(statusLayout);
mainLayout->addLayout(seekerLayout);
mainLayout->addLayout(playControlLayout);
QWidget*widget=newQWidget;
widget->setLayout(mainLayout);
setCentralWidget(widget);
setWindowTitle(tr("视频播放器"));
}
voidMainWindow:
:
playOrPause()
{
if(mediaObject->state()==Phonon:
:
PlayingState)
{
mediaObject->pause();
}
else
{
mediaObject->play();
}
}
voidMainWindow:
:
fullOrNormalScreen()
{
videoWidget->setFullScreen(true);
}
voidMainWindow:
:
keyPressEvent(QKeyEvent*keyEvent)
{
if(keyEvent->key()==Qt:
:
Key_Escape)
{
videoWidget->setFullScreen(false);
}
}
voidMainWindow:
:
mediaStateChanged(Phonon:
:
StatenewState)
{
switch(newState)
{
casePhonon:
:
ErrorState:
if(mediaObject->errorType()==Phonon:
:
FatalError)
QMessageBox:
:
warning(this,tr("FatalError"),mediaObject->errorString());
else
QMessageBox:
:
warning(this,tr("Error"),mediaObject->errorString());
break;
casePhonon:
:
PlayingState:
playAction->setIcon(style()->standardIcon(QStyle:
:
SP_MediaPause));
timeLcd->setVisible(true);
playStateLabel->setText(tr("播放中"));
break;
casePhonon:
:
PausedState:
playAction->setIcon(style()->standardIcon(QStyle:
:
SP_MediaPlay));
playStateLabel->setText(tr("暂停"));
break;
casePhonon:
:
StoppedState:
playAction->setIcon(style()->standardIcon(QStyle:
:
SP_MediaPlay));
timeLcd->setVisible(false);
break;
casePhonon:
:
BufferingState:
break;
default:
;
}
}
voidMainWindow:
:
tick(qint64time)
{
QTimedisplayTime(0,(time/60000)%60,(time/1000)%60);
timeLcd->display(displayTime.toString("mm:
ss"));
}
voidMainWindow:
:
stop()
{
mediaObject->stop();
mediaObject->clearQueue();
timeLcd->display("00:
00");
//setWindowTitle(QApplication:
:
);
}
4)修改mainwindow.h如下:
//mainwindow.h
#ifndefMAINWINDOW_H
#defineMAINWINDOW_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
classMainWindow:
publicQMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget*parent=0);
~MainWindow();
protected:
voidkeyPressEvent(QKeyEvent*);
private:
Phonon:
:
MediaObject*mediaObject;
Phonon:
:
VideoWidg