Qt 之 MediaPlayer 音视频播放
文章目录
- 1、QMediaPlayer简介
- 2、相关类介绍
- 2.1 QMediaPlayer
- 2.1.1 简单用法:
- 2.1.2 关键枚举类
- 2.1.3 QMediaPlayer 常用属性
- 2.2 QVideoWidget
- 2.3 QMediaPlaylist
- 2.4 QML 相关用法
- 2.4.1 MediaPlayer
- 2.4.2 QML Audio
- 2.4.3 QML Video
- 3. 遇到的bug
- 3.1 调整倍速,不起作用
- 3.1 当弱网情况下,拖动进度条,导致UI卡主
1、QMediaPlayer简介
QMediaPlayer是Qt提供的一个跨平台媒体播放器类。它没有自带解码库,而是对平台相关的播放器框架做了封装,提供了平台无关的API。
在Windows下时,底层基于微软的DirectShow框架实现,需要提前安装解码库。可以下载K-Lite_Codec_Pack或者LAVFilters解码库安装。LAVFilters
,下载地址:https://github.com/Nevcairiel/LAVFilters/releases
在Linux下时,底层基于GStreamer框架实现。
2、相关类介绍
2.1 QMediaPlayer
2.1.1 简单用法:
播放音频:
player = new QMediaPlayer;connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));player->setVolume(50);player->play();
播放视频:
QVideoWidget可与QMediaPlayer一起用于视频渲染,与QMediaPlaylist一起用于访问播放列表功能。
playlist = new QMediaPlaylist;playlist->addMedia(QUrl("http://example.com/movie1.mp4"));playlist->addMedia(QUrl("http://example.com/movie2.mp4"));playlist->addMedia(QUrl("http://example.com/movie3.mp4"));playlist->setCurrentIndex(1);player = new QMediaPlayer;player->setPlaylist(playlist);videoWidget = new QVideoWidget;player->setVideoOutput(videoWidget);videoWidget->show();player->play();
2.1.2 关键枚举类
这些关键的枚举类,是实现好用的播放器的关键。需要重点关注哦。
播放器状态 QMediaPlayer::State
播放器有暂停、正在播放和停止三种状态,每种状态由下面 QMediaPlayer::MediaStatus来最终表现
状态枚举名称 | 枚举值 | 说明 |
---|---|---|
StoppedState | 0 | 播放停止状态 |
PlayingState | 1 | 播放状态 |
PausedState | 2 | 播放暂停状态 |
媒体状态 QMediaPlayer::MediaStatus
状态枚举名称 | 枚举值 | 说明 |
---|---|---|
UnknownMediaStatus | 0 | 未知状态 |
Nomedia | 1 | 无媒体文件,player处于StoppedState |
LoadingMedia | 2 | 媒体文件加载中,player可以处于任何状态 |
LoadedMedia | 3 | 媒体文件已加载,player处于StoppedState |
StalledMedia | 4 | 媒体处于延迟或者暂时的中断状态,player处于PlayingState或者PauseState |
BufferingMedia | 5 | 媒体正在缓冲数据,player处于PlayingState或者PausedState |
BufferedMedia | 6 | 媒体缓冲数据完成,player处于PlayingState或者PausedState |
EndOfMedia | 7 | 媒体结束,player处于StoppedState |
InvalidMedia | 8 | 非法的媒体文件,player处于StoppedState |
播放标志位:Flags
状态枚举名称 | 枚举值 | 说明 |
---|---|---|
LowLatency | 1 | 播放未压缩的音频数据,播放表现为低延时,需要播放beeps,ringtones等 |
StreamPlayback | 2 | 播放基于QIODevic构建的媒体文件,QMediaPlayer或自动选择支持的流行播放 |
VideoSurface | 4 | 渲染视频到QAbstractVideoSurface otput |
QMediaPlayer::Error 错误标志位
状态枚举名称 | 枚举值 | 说明 |
---|---|---|
NoError | 0 | 无错误 |
ResourceError | 1 | 媒体源错误 |
FormatError | 2 | 格式错误,播放可能会丢失音频或视频 |
NetworkError | 3 |
网络错误 |
AccessDeniedError | 4 | 访问权限错误 |
ServiceMissingError | 5 | 服务丢失错误 |
2.1.3 QMediaPlayer 常用属性
属性名称 | 取值类型 | 说明 | 访问函数 |
---|---|---|---|
audioAvailable | const bool | 音频是否可用,audioAvailableChanged信号函数用于监控其状态 | bool isAudioAvailable() |
muted | bool | 是否静音, void mutedChanged(bool muted) 信号函数用于监控其状态 | bool isMuted() |
audioRole | QAudio::Role | 音频流播放role |
QAudio::Role audioRole() const void setAudioRole(QAudio::Role audioRoe) |
bufferStatus | const int | 缓冲数据的百分比,在开始播放或者回复播放之前 |
int bufferStatus() const void bufferStatusChanged(int percentFilled) |
currentMedia | const qMediaContent | 当前激活的媒体,在使用Playlist时,可能与media属性不同 |
QMediaContent currentMedia() const void currentMediaChanged(const QMediaContent &media) |
duration | const qint64 | currentMedia的播放时长,单位ms |
qint64 duration() const void durationChanged(qint64 duration) |
media | QmediaContent | 激活并被使用的媒体源 |
QMediaContent media() const, void setMedia(const QMediaContent &media, QIODevice *stream=nullptr), void mediaChanged(const QMediaContent &media) |
playbackRate | qreal | 当前媒体的播放速度,默认为1.0 |
qreal playbackRate() const void setPlaybackRate(qreal rate) void playbackRateChanged(qreal rate) |
playlist | QMediaPlaylist * | 播放列表 |
QMediaPlaylist *playlist() const void setPlaylist(QMediaPlaylist *playlist) |
volume | int | 音量,取值范围0-100 |
int volume() const, void setVolume(int volume) void volumeChanged(int volume) |
2.2 QVideoWidget
QvideoWidget是一个用来展示视频的类,需要先定义一个QMediaPlayer对象,然后将QMediaPlayer的VideoOutput设置为QVideoWidget对象
常用属性
名称 | 类型 | 说明 |
---|---|---|
aspectRatioMode | Qt::AspectRatioMode | 屏幕亮度比 |
brightness | int | 亮度 |
contrast | int | 对比度 |
fullScreen | bool | 是否全屏 |
hue | int | 色调 |
mediaObject | QMediaObject *const | 视频媒体对象 |
saturation | int | 饱和度 |
方法:
返回值类型 | 函数名称 | 描述说明 |
---|---|---|
Qt::AspectRatioMode | aspectRatioMode() const | 获取视频画面宽高比 |
int | saturation() const | 获取饱和度 |
int | brightnees() const | 获取亮度 |
int | contrast() const | 获取对比度 |
int | hue() const | 获取色调 |
bool | isFullScreen() const | 获取全屏状态 |
槽函数
返回值类型 | 函数名称 | 描述说明 |
---|---|---|
void | setAspectRatioMode(Qt::AspectRatioMode mode) | 设置宽高比 |
void | setBrightness(int brightness) | 设置亮度 |
void |
setContrast(int contrast) |
设置对比度 |
void | setFullScreen(bool fullScreen) | 设置全屏状态 |
void | setHue(int hue) | 设置色调 |
void | setSaturation(int saturation) | 设置饱和度 |
2.3 QMediaPlaylist
QMediaPlaylist类,可以为QMediaPlayer提供一个播放列表,它其实是QMediaContent对象的列表,QMediaPlayer通过函数setPlaylist来设置一个播放列表。QMediaPlaylist通过函数addMedia向播放列表添加一个媒体文件。
播放模式:PlaybackMode
状态枚举名称 | 枚举值 | 说明 |
---|---|---|
CurrentItemOnce | 0 | 当前选中的媒体文件仅播放一次 |
CurrentItemInLoop | 1 | 当前选中的媒体文件循环播放 |
Sequential | 2 | 从当前选中的媒体文件开始,列表中的文件顺序播放一次直到最后一个文件 |
Loop | 3 | 列表中的文件顺序循环播放 |
Random | 4 | 列表中的文件随机播放 |
属性:
名称 | 类型 | 说明 |
---|---|---|
currentIndex | int | 当前播放的媒体文件在列表中的索引 |
currentMedia | const QMediaContent | 当前选中的媒体文件 |
playbackMode | QMediaPlaylist::PlaybackMode | 从当前选中的媒体文件开始,列表中的文件顺序播放一次直到最后一个文件 |
方法:
返回值类型 | 函数名称 | 描述说明 |
---|---|---|
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) | 设置列表播放模式 |
槽函数:
返回值类型 | 函数名称 | 描述说明 |
---|---|---|
void | next() | 下一个文件 |
void | previous() | 上一个文件 |
void | setCurrentIndex(int playlistPosition) | 设置当前播放媒体的所有 |
void | shuffle() | 媒体顺序洗牌,重建媒体的索引 |
信号:
返回值类型 | 函数名称 | 描述说明 |
---|---|---|
void | currentIndexChanged(int position) | 当前索引改变信号 |
void | currentMediaChanged(const QMediacontent &content) | 当前媒体文件改变信号 |
void | loadFailed() | 加载失败信号 |
void | loaded() | 加载完成信号 |
void | mediaAboutToBeInserted(int start, int end) | 媒体即将插入信号 |
void | mediaAboutToBeRemoved(int start, int end) | 媒体即将被删除信号 |
void | mediaChanged(int start, int end) | 媒体文件改变信号 |
void | mediaInserted(int start, int end) | 媒体文件插入信号 |
void | mediaRemoved(int start, int end) | 媒体文件删除信号 |
void | playbackModeChanged(QMediaPlaylist::PlaybackMode mode) | 列表播放模式改变信号 |
2.4 QML 相关用法
2.4.1 MediaPlayer
import QtMultimedia 5.0MediaPlayer {id: player;source: control.sourceonPositionChanged:{}onError: {console.error("MediaPlayer error:",errorString)}onPlaying:{}onStatusChanged:{console.warn("onStatusChanged",status);}onPlaybackStateChanged:{}onMediaObjectChanged: { }}
2.4.2 QML Audio
Text {text: "Click Me!";font.pointSize: 24;width: 150; height: 50;Audio {id: playMusicsource: "music.wav"}MouseArea {id: playAreaanchors.fill: parentonPressed: { playMusic.play() }}}
2.4.3 QML Video
Video 是一种方便的类型,它将MediaPlayer的功能和视频输出结合在一起。它提供了简单的视频播放功能,无需声明多种类型。
Video {id: videowidth : 800height : 600source: "video.avi"MouseArea {anchors.fill: parentonClicked: {video.play()}}focus: trueKeys.onSpacePressed: video.playbackState == MediaPlayer.PlayingState ? video.pause() : video.play()Keys.onLeftPressed: video.seek(video.position - 5000)Keys.onRightPressed: video.seek(video.position + 5000)}
3. 遇到的bug
特定版本:5.10
3.1 调整倍速,不起作用
调整播放倍速时,不起作用,后来通过重新设置下seek进度,来解决了。
function setPlayerSpeed(speed){var num = parseFloat(speed.slice(0,speed.length-1))player.playbackRate = numconsole.log("setPlayerSpeed",num)player.seek(player.position - 1000);}
3.1 当弱网情况下,拖动进度条,导致UI卡主
1 是通过优化进度条的通知时机 比如 信号 moved
2 是通过媒体的状态flage 来展示loading 进行优化
Qt 之 MediaPlayer 音视频播放相关推荐
- MediaPlayer音视频播放
MediaPlayer介绍 MediaPlayer类可用于控制音频/视频文件或流的播放. MediaPlayer函数: 实例化方式 使用直接new的方式: MediaPlayer mp = new M ...
- 6、Qt Project之音视频播放
音视频播放 这里简单的制作了一个音乐播放器,播放器的界面设计如下所示: Step1:这里是界面对应的HTML文件: <?xml version="1.0" encoding ...
- Qt基于QMediaPlayer音视频播放
一. 前言 打开Qt的示例,可以找到Media Player Example,这是一个Qt官方提供的简易视频播放器示例,基于QMediaPlayer实现. 但是运行发现,视频怎么也播放不了,后来通过查 ...
- 基于QT封装的音视频播放时间轴控件
采用QT graphicsview视图框架,可以实现时间轴缩放,指针拖拉,滚动条移动,可以新增指针事件等,提供时间片添加接口. 思路:左侧车牌信息和通道列表是qwidget正常的窗口,右侧的时间轴,通 ...
- 基于QT实现简易音视频播放器
目录: 一.界面布局 二.播放本地音频 2.1 打开本地音频保存路径 2.2 选中想要播放的音频加入到播 ...
- Qt - 音视频播放
播放内存中的音乐 QFile read("./music/Nevada.mp3");if (!read.open(QIODevice::ReadOnly)){qDebug() &l ...
- C++Qt开发——音视频播放
播放内存中的音乐 QFile read("./music/Nevada.mp3");if (!read.open(QIODevice::ReadOnly)){qDebug() &l ...
- QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器
QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...
- 基于Qt、FFMpeg的音视频播放器设计一
前言:整个项目的源代码 https://download.csdn.net/download/hfuu1504011020/10672140 最近刚完成基于Qt.FFMpeg的音视频播放器相关C++程 ...
最新文章
- 代码管理和版本管理的作业流程以及规范是怎样的?
- 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
- Hibernate提高性能的几点建议
- ES6-9 对象密封4种方式、assign、取值函数的拷贝
- dropMenu----简单的下拉菜单生成器
- WIN 10 安装 Hadoop 2.7.7 + Spark 2.4.7 记录
- python初学者怎么找工作_学python找工作好找吗
- Docker搭建SonarQube代码质量检查平台
- Ubuntu 系统安装APACHE PHP MYSQL
- 数据科学 IPython 笔记本 8.3 Matplotlib 可视化
- 云服务器 ECS > 块存储 > 块存储介绍 > 块存储概述 请输入关键词
- 拉格朗日(lagrange)插值及其MATLAB程序
- 新的特洛伊木马程序SectopRAT用以控制浏览器会话
- 百度用户增长SQL面试题
- 如何搭建一套业务、数据一体化的数据指标体系
- Arcgis专题制图流程
- 成功实施的APS项目故事分享---如何管理与激励APS项目团队
- 【OAuth2】三、OAuth2配置解读
- yum源服务器本地配置
- c语言汇编6,C语言是如何转换成汇编语言的6个步骤带你解析
热门文章
- 盖雅招聘联合Moka开启招聘新模式
- java项目 升级jdk1.8 遇到 tomcat启动 are only available on JDK 1.5 and higher错误
- [Unity]角色头顶血条的实现的几种方法以及优化拓展
- ​力扣解法汇总522-最长特殊序列 II
- 微信内置浏览器 缓存清理
- win10安装Andorid Studio常见问题
- Linux上面查看虚拟机的ID,Linux虚拟机的设备id与盘符不相符怎么办?
- 使用pytorch动手实现完整的GLU层
- 材料科学计算机模拟技术,计算机模拟技术在材料科学中的应用
- 解决server returned HTTP status 401 Unauthorized