文章目录
-
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