Qt多媒体编程

文章目录

  • 音频

  • 视频

  • Qt Multimedia模块为多媒体编程提供支持。多媒体编程实现的功能注意包括播放音频和视频文件,通过麦克风录制音频,通过摄像头拍照和录像等。相比Qt5,Qt6的多媒体模块做了全新的改写,舍弃了一些类,也引入了一些新的类。所以Qt6中编译Qt5编写的多媒体程序基本是无法成功的

  • Qt 6 多媒体模块是在 Qt 6.2 中才正式发布的

  • Qt 6 多媒体模块在不同的平台上使用不同的后端,Linux上是 GStreamer,Windows 上是 WMF,macOS 和 iOS 上是AVFoundation,Android 上是 Android 多媒体 API

  • Qt 6 多媒体模块包含两个子模块:Qt Multimedia 模块提供了多媒体编程用到的大部分类;Qt Multimedia Widgets 模块提供了多媒体编程中用到的界面组件类,如播放视频时用于显示视频的界面组件类QVideoWidget

  • 要在项目中使用这两个模块,需要在项目配置文件(.pro 文件)中加入

bash 复制代码
QT += multimedia
QT += multimediawidgets
  • 在程序文件中,如果需要用到这两个模块中的类,使用下面的包含(include)语句可以包含模块中的大部分类
cpp 复制代码
#include <QtMultimedia>
#include <QtMultimediaWidgets>

音频

  • QMediaPlayer 可以用于播放经过压缩的音频文件,如 MP3 文件和 WMA 文件
  • QSoundEffect 可以用于播放低延迟音效文件,例如无压缩的 WAV 文件
  • 以上两个类都可以用于播放本地文件和网络文件
  • 常用函数(包括SLOT)
cpp 复制代码
//构造函数
QMediaPlayer::QMediaPlayer(QObject *parent = nullptr)
//设置一个音频输出设备
void setAudioOutput(QAudioOutput *output)
//设置播放媒介来源,本地文件或者网络文件
[slot] void QMediaPlayer::setSource(const QUrl &source)
//设置播放速度,1.0 表示正常速度
void setPlaybackRate(qreal rate)
void setLoops(int loops) //设置播放的循环次数
//返回当前播放器状态
QMediaPlayer::PlaybackState playbackState() const
QMediaMetaData metaData() //返回当前媒介的元数据
qint64 duration() //媒介的持续时间,单位为 ms
void setPosition(qint64 position) //设置当前的播放位置,单位为 ms
qint64 position() //返回当前的播放位置,单位为 ms
void play() //开始播放
void pause() //暂停播放
void stop() //停止播放
  • 常用信号
cpp 复制代码
void durationChanged(qint64 duration) //媒介的持续时间发生变化
void mediaStatusChanged(QMediaPlayer::MediaStatus status) //媒介状态发生变化
void metaDataChanged() //媒介的元数据发生变化
void playbackStateChanged(QMediaPlayer::PlaybackState newState) //播放器状态发生变化
void positionChanged(qint64 position) //播放位置发生变化
void sourceChanged(const QUrl &media) //媒介来源发生变化
  • 在创建一个 QMediaPlayer 对象后,必须先用函数 setAudioOutput()设置一个音频输出设备,再用函数 setSource()设置播放媒介来源(可以是本地文件或网络文件),用函数 play() 开始播放。使用 pause()和 stop()函数可以暂停和停止播放
  • QMediaPlayer 在开始、暂停或停止播放时,播放器状态发生变化,会发射 playbackStateChanged() 信号,函数playbackState()会返回当前播放器状态。播放器状态用枚举类型 QMediaPlayer::PlaybackState 表示,有如下几种取值:
    • QMediaPlayer::PlayingState,正在播放
    • QMediaPlayer::PausedState,暂停播放
    • QMediaPlayer::StoppedState,已停止播放
  • 媒介有元数据,函数 metaData()可以返回当前媒介的元数据,重新设置媒介时会发射 metaDataChanged()信号。媒介的元数据是 QMediaMetaData 类型数据,元数据用"key-value"形式的键值对表示,QMediaMetaData 主要有以下几个函数:
cpp 复制代码
QList<QMediaMetaData::Key> keys() //返回键名称列表
QString stringValue(QMediaMetaData::Key key) //以字符串形式返回一个键的数据
QVariant value(QMediaMetaData::Key key) //以 QVariant 类型返回一个键的数据
  • 利用媒介的元数据,我们可以提取媒介的一些信息,例如对于 MP3 和 WMA 格式的音乐文件, 可以提取歌手(Author)和专辑图片(ThumbnailImage)等信息
枚举常量 类型 意义
Title QString 媒介的标题
Author QStringList 媒介的作者
Description QString 对媒介的描述
FileFormat QMediaFormat::FileFormat 媒介的文件格式
Duration qint64 媒介的持续时间,单位为 ms
AudioBitRate int 音频流的比特率
AudioCodec QMediaFormat::AudioCodec 枚举类型 音频流的编码格式
VideoFrameRate qreal 视频的帧率
VideoBitRate int 视频的比特率
VideoCodec QMediaFormat::VideoCodec 枚举类型 视频流的编码格式
ThumbnailImage QImage 嵌入的专辑缩略图
AlbumTitle QString 专辑标题

视频

  • QMediaPlayer 类不仅能播放音频文件,也可以播放各种常见的视频文件,如 MP4 文件和 WMV文件QMediaPlayer 能对视频文件进行解码,并在某个界面组件上显示视频帧
  • 要使用 QMediaPlayer 播放视频,必须用函数 setVideoOutput()设置用于显示视频的界面组件,有QVideoWidget 和QGraphicsVideoItem 两种显示视频的组件:
    • QVideoWidget 是 QWidget 的子类, 是普通的界面组件
    • QGraphicsVideoItem是适用于图形/视图架构的图形项
cpp 复制代码
void setVideoOutput(QObject *) //设置用于显示视频的界面组件
QObject *videoOutput() //返回显示视频的界面组件
  • 需要用函数 setAudioOutput()设置音频输出通道,否则播放视频时会没有声音
  • 一般需要提前安装以下依赖:
bash 复制代码
sudo apt install libdvdnav4 libdvd-pkg gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly libdvdpkg
相关推荐
辞旧 lekkk7 小时前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
liuhuizuikeai10 小时前
可视化门禁---Linux/Qt+SqLite篇
linux·运维·qt
螺丝钉的扭矩一瞬间产生高能蛋白14 小时前
QT的C++接口基础用法
c++·qt·嵌入式软件·嵌入式linux·linux应用
张人玉19 小时前
PyCharm配置PyQt5安装报错详情笔记
笔记·qt·pycharm·pyqt5
小许同学记录成长1 天前
三维编辑功能实现
qt·算法·无人机
gqk011 天前
C++ / MFC / Qt / C# 核心知识点汇总笔记
c++·qt·mfc
leo__5201 天前
基于 OpenCV + Qt 的水果智能识别分类系统
qt·opencv·分类
代钦塔拉1 天前
Qt 按钮 Lambda 信号槽重复绑定、多次触发 BUG 深度剖析与终极解决方案
c++·qt·bug
没想好取什么名1 天前
解决vscode打开qt creator项目头文件报错的现象
ide·vscode·qt
用户805533698032 天前
现代Qt开发教程(新手篇)1.14——日志
c++·qt