QT实验十多媒体程序实验.docx

上传人:b****6 文档编号:5012879 上传时间:2022-12-12 格式:DOCX 页数:13 大小:54.94KB
下载 相关 举报
QT实验十多媒体程序实验.docx_第1页
第1页 / 共13页
QT实验十多媒体程序实验.docx_第2页
第2页 / 共13页
QT实验十多媒体程序实验.docx_第3页
第3页 / 共13页
QT实验十多媒体程序实验.docx_第4页
第4页 / 共13页
QT实验十多媒体程序实验.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

QT实验十多媒体程序实验.docx

《QT实验十多媒体程序实验.docx》由会员分享,可在线阅读,更多相关《QT实验十多媒体程序实验.docx(13页珍藏版)》请在冰豆网上搜索。

QT实验十多媒体程序实验.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1