c++ Qt5 学习笔记 2021-1-15(2)(多媒体模块的应用:QMediaPlayer、QMediaPlaylist、QVideoWidget的使用,音乐播放器,视频播放器)

44 篇文章 8 订阅

部分资料整理自Qt5.9 C++开发指南,其余部分资料从网络中获取和整合和自己实验补充。

在.pro文件中引入多媒体:
QT += multimedia
如果需要使用视频功能,还需引入:
QT += multimediawidgets(引入了QVideoWidgetQGraphicsVideoItem等)

想要使用这些接口播放音视频文件时,首先需要在头文件中进行引入:

#include <QMediaPlayer>
#include <QVideoWidget>
#include <QMediaPlaylist>

不同种播放器使用的类:
音频播放器(MP3、AAC等) QMediaPlayer,QMediaPlaylist
播放音效文件(WAV文件) QSoundEffect,QSound
播放低延迟的音频 QAudioOutput
访问原始音频输入数据 QAudioInput
录制编码的音频数据 QAudioRecorder
发现音频设备 QAudioDeviceInfo
视频播放 QMediaPlayer,QVideoWidget,QGraphicsVideoItem
视频处理 QMediaPlayer,QVideoFrame,QAbstractVideoSurface
摄像头取景框 QCamera,QVideoWidget,QGraphicsVideoItem
取景框预览处理 QCamera,QAbstractVideoSurface,QVideoFrame
摄像头拍照 QCamera,QCameraImageCapture
摄像头录像 QCamera,QMediaRecorder
收听数字广播 QRadioTuner,QRadioData

1、几种播放器
(1)QMediaPlayer:

主要函数:

//函数原型                                                功能描述
qint64 duration()                                 //当文件播放时间总长,单位ms
void setPosition(qint64 position)                 //设置当前文件播放位置,单位ms
void setMuted(bool muted)                         //设置是否静音
bool isMuted()                                    //返回是否静音的状态,true表示静音
void setPlaylist(QMediaPlaylist *playlist)        //设置播放列表,执行过程类似队列,自动播放下一曲
QMediaPlaylist* playlist()                        //返回设置的播放列表
State state()                                     //返回播放器当前的状态
void setVolume(int volume)                        //设置播放音量,0至100之间
void setPlaybackRate(qreal rate)                  //设置播放速度,缺省为1,表示正常速度
void setMedia(QMediaContent &media)               //设置播放的媒体文件,区别于setPlaylist(),只播放单个文件
QMediaContent currentMedia()                      //返回当前播放器的媒体文件
void play()                                       //开始播放
void pause()                                      //暂停播放
void stop()                                       //停止播放

QMediaPlayer中的信号:

stateChanged(QMediaPlayer::State state)会在播放状态发生改变时切换。
QMediaPlayer::State state对应的QMediaPlayer的三种播放状态:

QMediaPlayer::StoppedState      //在stop()触发时发射
QMediaPlayer::PlayingState      //在play()触发时发射
QMediaPlayer::PausedState       //在pause()触发时发射

其他信号:

durationChanged(qint64 duration)    //当文件的时间长度变化时发射此信号,比如使用setMedia()切换文件时,文件时长改变会发射这个信号,duration返回文件的长度,单位为毫秒。
positionChanged(qint64 position)    //当文件播放位置变化时发射此信号,反应文件的播放进度。此信号监视的对象为position,因此我们可以通过修改position来改变音乐文件的播放进度,position返回的单位为毫秒。
metaDavaAvailableChaned()          //当QMediaplayer读入到媒体文件式,就会发射这个信号。我们就可以根据该信号,通过metaData(const QString & key)来读入媒体文件的相关信息。
(2)QMediaPlaylist:

主要函数:
来自:https://blog.csdn.net/u010037542/article/details/100075368
修正了个别有错误的解释。

bool addMedia(const QMediaContent &content)	//Public Functions列表添加单个媒体文件
bool	addMedia(const Qlist &items)	//Public Functions,列表添加多个媒体文件
int	currentIndex() const	//获得当前播放媒体的索引
QMediaContent	currentMedia() const	//获得当前播放的媒体列表
QMediaPlaylist::Erroe	error() const	//列表错误状态
QString	errorString() const	//播放列表错误字符串信息
bool	insertMedia(int pos, const QMediaContent &content)	//向播放列表插入一个媒体文件
bool	insertMedia(int pos, const QList &items)	//向播放列表插入多个媒体文件
bool	isEmpty() const	//是否空列表
bool	isReadOnly() const	//是否仅只读
void	load(const QNetworkRequest &request, const char *format=nullptr)	//加载网络媒体
void	load(const QRul &location, const char *format=nullptr)	//加载本地媒体文件
void	load(QIODevice *device, const char *format=nullptr)	//加载IO设备文件
QMediaContent	meida(int index) const	//获得指定索引的媒体文件
int mediaCount() const	//统计播放列表的文件数量
bool	moveMedia(int from, int to)	//根据位置参数移动媒体文件
int	nextIndex(int steps=1) const	//当前播放文件的下一个文件索引
PlaybackMode	playbackMode() const	//获取列表播放模式
int	previousIndex(int steps=1) const	//当前播放文件的上一个文件索引
bool	removeMedia(int pos)	//删除列表中指定位置的文件
bool	removeMedia(int start, int end)	//删除列表中start到end之间的文件
bool	save(const QUrl &location, const char *format=nullptr)	//保存列表QUrl指定位置
bool	save(QIODevice *device, const char *format)	//保存列表到IO设备
void	setPlaybackMode(QMediaPlaylist::PlaybackMode mode)	//设置列表播放模式

QMediaPlaylist中的信号:

currentIndexChanged(int position)          //当前播放的文件在list中的索引的位置改变时发射
currentMediaChanged(const QMediacontent &content)          //当前播放的媒体文件改变时发射
//播放下一首时,两个信号都会触发,不过currentindex监视的是歌曲的索引,
//而currentmedia监视的是媒体文件

loadFailed()	//加载失败信号
loaded()	//加载完成信号
mediaAboutToBeInserted(int start, int end)	//媒体即将插入信号
mediaAboutToBeRemoved(int start, int end)	//媒体即将被删除信号
mediaChanged(int start, int end)	//媒体文件改变信号
mediaInserted(int start, int end)	//媒体文件插入信号
mediaRemoved(int start, int end)	//媒体文件删除信号
playbackModeChanged(QMediaPlaylist::PlaybackMode mode)	//列表播放模式改变信号

可用的槽函数:

void	next()	//下一个文件
void	previous()	//上一个文件
void	setCurrentIndex(int playlistPosition)	//设置当前播放媒体的所有
void	shuffle()	//媒体顺序洗牌,重建媒体的索引
(3)QVideoWidget:

来自:https://blog.csdn.net/u010037542/article/details/100075368
主要函数:

Qt::AspectRatioMode	aspectRatioMode() const	//获取视频画面宽高比
int	saturation() const	//获取饱和度
int	brightnees() const	//获取亮度
int	contrast() const	//获取对比度
int	hue() const	//获取色调
bool	isFullScreen() const	//获取全屏状态

QVideoWidget中的信号:

brightnessChanged(int brightness)	//亮度改变信号
contrastChanged(int contrast)	//对比度改变信号
fullScreenChanged(bool fullScreen)	//全屏状态改变信号,屏幕状态切换信号
hueChanged(int hue)	//色调改变信号
saturationChanged(int saturation)	//饱和度改变信号

可用的槽函数:

setAspectRatioMode(Qt::AspectRatioMode mode)	   //设置宽高比
setBrightness(int brightness)    	//设置亮度
setContrast(int contrast)        //设置对比度
setFullScreen(bool fullScreen)	    //设置全屏状态
setHue(int hue)	     //设置色调
setSaturation(int saturation)	   //设置饱和度

2、音频播放:

这里主要使用QMediaPlayer来实现播放音乐,既可以播放本地音乐,又可以播放网络上的音乐。
(1)简单的使用:
QMediaPlayer为例,简单的使用,在mainwindow.hmianwindow.cpp中添加如下代码即可实现实现播放音乐。

//mainwindow.h中
QMediaPlayer *player;  //播放器
//mainwindow.cpp中
player =new QMediaPlayer(this);  //播放器
player->setMedia(QUrl::fromLocalFile("F:/1/1.mp3"));  //音乐文件
player->play();

(2)音乐播放器软件:
通过参考教程上的代码,做了一个播放器,代码已上传:
https://download.csdn.net/download/qq_36780295/14142084
(本来想做视频播放的,所以名字起了个video_play,不要在意)

主要是使用QMediaPlayer来实现音乐的播放,软件的整体结构参照的教程上的指导程序。
在这里插入图片描述

3、视频播放:

由于视频播放需要使用控件来作为画面输出的载体,所以使用QMediaPlayerQVideoWidget来实现视频播放器。

(1)简单的使用:
mainwindow.h中:

public:
    QMediaPlayer *player;
    QVideoWidget *videoWidget;

mainwindow.cpp中:

    player=new QMediaPlayer(this); //视频播放器
    player->setNotifyInterval(2000);   //信息更新周期2000ms
    videoWidget = new QVideoWidget(this);  //视频显示组件

    videoWidget->setStyleSheet("QVideoWidget{background-color:white;}");
    //videoWidget->move(10,10);
    videoWidget->setGeometry(10,10,780,450);

    player->setVideoOutput(videoWidget);    //必须要有画面输出控件
    player->setMedia(QUrl::fromLocalFile("F:/1/1.mp4"));   //加载视频文件
    player->play();

运行结果:
在这里插入图片描述
除此之外,之前在python中已经用的很熟的使用opencv不断读取视频的每一帧也可以用来播放视频,把每一帧的画面传递给控件显示。

(2)报错:

如果报错:

DirectShowPlayerService::doRender: Unresolved error code 0x80040266 (IDispatch error #102)

解决:
安装LAV Filters,下载地址:http://files.1f0.de/lavf/LAVFilters-0.65.exe,一直点next装完就可以了。

(3)视频播放器软件:

参照功能,搞了个视频播放器,项目包已上传,地址:https://download.csdn.net/download/qq_36780295/14396271

在这里插入图片描述

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值