部分资料整理自Qt5.9 C++开发指南
,其余部分资料从网络中获取和整合和自己实验补充。
在.pro文件中引入多媒体:
QT += multimedia
如果需要使用视频功能,还需引入:
QT += multimediawidgets
(引入了QVideoWidget
和QGraphicsVideoItem
等)
想要使用这些接口播放音视频文件时,首先需要在头文件中进行引入:
#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.h
和mianwindow.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、视频播放:
由于视频播放需要使用控件来作为画面输出的载体,所以使用QMediaPlayer
和QVideoWidget
来实现视频播放器。
(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