文章目录

  • 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 音视频播放相关推荐

  1. MediaPlayer音视频播放

    MediaPlayer介绍 MediaPlayer类可用于控制音频/视频文件或流的播放. MediaPlayer函数: 实例化方式 使用直接new的方式: MediaPlayer mp = new M ...

  2. 6、Qt Project之音视频播放

    音视频播放  这里简单的制作了一个音乐播放器,播放器的界面设计如下所示: Step1:这里是界面对应的HTML文件: <?xml version="1.0" encoding ...

  3. Qt基于QMediaPlayer音视频播放

    一. 前言 打开Qt的示例,可以找到Media Player Example,这是一个Qt官方提供的简易视频播放器示例,基于QMediaPlayer实现. 但是运行发现,视频怎么也播放不了,后来通过查 ...

  4. 基于QT封装的音视频播放时间轴控件

    采用QT graphicsview视图框架,可以实现时间轴缩放,指针拖拉,滚动条移动,可以新增指针事件等,提供时间片添加接口. 思路:左侧车牌信息和通道列表是qwidget正常的窗口,右侧的时间轴,通 ...

  5. 基于QT实现简易音视频播放器

    目录:         一.界面布局         二.播放本地音频                 2.1 打开本地音频保存路径                 2.2 选中想要播放的音频加入到播 ...

  6. Qt - 音视频播放

    播放内存中的音乐 QFile read("./music/Nevada.mp3");if (!read.open(QIODevice::ReadOnly)){qDebug() &l ...

  7. C++Qt开发——音视频播放

    播放内存中的音乐 QFile read("./music/Nevada.mp3");if (!read.open(QIODevice::ReadOnly)){qDebug() &l ...

  8. QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器

    QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...

  9. 基于Qt、FFMpeg的音视频播放器设计一

    前言:整个项目的源代码 https://download.csdn.net/download/hfuu1504011020/10672140 最近刚完成基于Qt.FFMpeg的音视频播放器相关C++程 ...

最新文章

  1. 代码管理和版本管理的作业流程以及规范是怎样的?
  2. 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
  3. Hibernate提高性能的几点建议
  4. ES6-9 对象密封4种方式、assign、取值函数的拷贝
  5. dropMenu----简单的下拉菜单生成器
  6. WIN 10 安装 Hadoop 2.7.7 + Spark 2.4.7 记录
  7. python初学者怎么找工作_学python找工作好找吗
  8. Docker搭建SonarQube代码质量检查平台
  9. Ubuntu 系统安装APACHE PHP MYSQL
  10. 数据科学 IPython 笔记本 8.3 Matplotlib 可视化
  11. 云服务器 ECS > 块存储 > 块存储介绍 > 块存储概述 请输入关键词
  12. 拉格朗日(lagrange)插值及其MATLAB程序
  13. 新的特洛伊木马程序SectopRAT用以控制浏览器会话
  14. 百度用户增长SQL面试题
  15. 如何搭建一套业务、数据一体化的数据指标体系
  16. Arcgis专题制图流程
  17. 成功实施的APS项目故事分享---如何管理与激励APS项目团队
  18. 【OAuth2】三、OAuth2配置解读
  19. yum源服务器本地配置
  20. c语言汇编6,C语言是如何转换成汇编语言的6个步骤带你解析

热门文章

  1. 盖雅招聘联合Moka开启招聘新模式
  2. java项目 升级jdk1.8 遇到 tomcat启动 are only available on JDK 1.5 and higher错误
  3. [Unity]角色头顶血条的实现的几种方法以及优化拓展
  4. ​力扣解法汇总522-最长特殊序列 II
  5. 微信内置浏览器 缓存清理
  6. win10安装Andorid Studio常见问题
  7. Linux上面查看虚拟机的ID,Linux虚拟机的设备id与盘符不相符怎么办?
  8. 使用pytorch动手实现完整的GLU层
  9. 材料科学计算机模拟技术,计算机模拟技术在材料科学中的应用
  10. 解决server returned HTTP status 401 Unauthorized