QT多媒体播放器类:QMediaPlayer
QMediaPlayer 是 Qt Multimedia 模块中的核心类,用于播放音频和视频媒体文件。它支持本地文件、网络流媒体以及实时数据源,具备播放控制、状态管理、元数据访问等功能。QMediaPlayer的基本用法可能包括设置媒体源、控制播放(播放、暂停、停止)、调整音量、监听播放状态变化等。
1. 信号(Signals)
信号用于通知外部对象播放器状态、媒体属性和错误事件的变化。
(1)媒体改变
void
mediaChanged
(const QMediaContent &media);
- 触发时机:当播放器的媒体内容被显式设置(如调用
setMedia()
)时触发。 - 参数:
QMediaContent
对象表示新加载的媒体内容。 - 用途:检测媒体是否成功加载,可用于预加载验证或界面元素更新。
void
currentMediaChanged
(const QMediaContent &media);
- 触发时机:当播放列表中的当前媒体切换时触发(如自动播放下一曲)。
- 参数:
QMediaContent
对象表示当前播放的媒体。 - 用途:结合
QMediaPlaylist
使用,实现播放列表切换的逻辑。
(2)状态变化
void stateChanged(QMediaPlayer::State newState);
- 触发时机:播放器状态改变时触发(如播放→暂停→停止)。
- 参数:
newState
是枚举值,可能的值包括:QMediaPlayer::PlayingState
QMediaPlayer::PausedState
QMediaPlayer::StoppedState
- 用途:更新界面按钮图标(播放/暂停)、显示状态栏信息。
void
mediaStatusChanged
(QMediaPlayer::MediaStatus status)
-
触发时机:媒体资源的状态变化(如加载中、已加载、缓冲中、播放结束)。
-
参数:
status
表示媒体状态:-
QMediaPlayer::LoadingMedia
:正在加载媒体。 -
QMediaPlayer::LoadedMedia
:媒体加载完成。 -
QMediaPlayer::BufferingMedia
:缓冲中(网络流媒体常见)。 -
QMediaPlayer::EndOfMedia
:播放完成。
-
(3)媒体播放进度
void durationChanged(qint64 duration);
- 触发时机:媒体元数据加载完成后触发(如歌曲总时长)。
- 参数:
duration
是媒体的总毫秒时长。 - 用途:更新进度条最大值或显示歌曲总时长。
void positionChanged(qint64 position);
- 触发时机:播放进度改变时(如用户拖动进度条或自动播放)。
- 参数:
position
是当前播放位置的毫秒数。 - 用途:实时更新进度条位置或显示当前播放时间。
(4)音频/视频可用性
void audioAvailableChanged(bool available);
- 触发时机:音频数据是否可用的状态变化。
- 参数:
available
为true
表示有音频数据可播放。 - 用途:处理无音频输出的异常情况(如仅视频文件)。
void videoAvailableChanged(bool videoAvailable);
- 触发时机:视频数据是否可用的状态变化。
- 参数:
videoAvailable
为true
表示有视频数据可播放。 - 用途:切换视频窗口可见性或处理纯音频文件
(5)其他常用信号
void playbackRateChanged(qreal rate);
- 触发时机:播放速率改变时(如用户调整倍速)。
- 参数:
rate
是新的播放速率(1.0=正常,0.5=0.5倍速)。
void seekableChanged(bool seekable);
- 触发时机:媒体是否支持随机跳转(如MP3支持,某些流媒体不支持)。
- 参数:
seekable
为true
表示可以跳转。
void mutedChanged(bool muted);
- 触发时机:静音状态切换时。
- 参数:
muted
为true
表示已静音。
Q_SIGNALS:
void mediaChanged(const QMediaContent &media);
void currentMediaChanged(const QMediaContent &media);
void stateChanged(QMediaPlayer::State newState);
void mediaStatusChanged(QMediaPlayer::MediaStatus status);
void durationChanged(qint64 duration);
void positionChanged(qint64 position);
void volumeChanged(int volume);
void mutedChanged(bool muted);
void audioAvailableChanged(bool available);
void videoAvailableChanged(bool videoAvailable);
void bufferStatusChanged(int percentFilled);
void seekableChanged(bool seekable);
void playbackRateChanged(qreal rate);
void audioRoleChanged(QAudio::Role role);
void customAudioRoleChanged(const QString &role);
void error(QMediaPlayer::Error error);
2. 槽函数(Slots)
槽函数用于接收外部指令(如用户点击按钮)来控制播放器行为。
public Q_SLOTS:
void play();
void pause();
void stop();
void setPosition(qint64 position); //跳转到指定时间位置
void setVolume(int volume);
void setMuted(bool muted);
void setPlaybackRate(qreal rate);
void setMedia(const QMediaContent &media, QIODevice *stream = nullptr);
void setPlaylist(QMediaPlaylist *playlist);
3. 枚举(enum)
enum State
{
StoppedState, // 停止状态
PlayingState, // 播放状态
PausedState // 暂停状态
};
enum MediaStatus
{
UnknownMediaStatus, // 未知状态(初始化值)
NoMedia, // 无媒体关联
LoadingMedia, // 正在加载媒体
LoadedMedia, // 媒体已加载完成
StalledMedia, // 播放卡顿(解码阻塞)
BufferingMedia, // 缓冲中(网络流场景)
BufferedMedia, // 已缓冲部分(可跳过前奏)
EndOfMedia, // 到达媒体末尾
InvalidMedia // 媒体格式/内容无效
};
enum Flag
{
LowLatency = 0x01, // 低延迟模式(实时性优化)
StreamPlayback = 0x02, // 流式播放模式(边下边播)
VideoSurface = 0x04 // 指定视频渲染表面(GPU加速)
};
Q_DECLARE_FLAGS(Flags, Flag) // 允许位运算组合
enum Error
{
NoError, // 无错误(默认值)
ResourceError, // 资源不可用(内存不足/文件损坏)
FormatError, // 格式不支持(如非MP4/WAV)
NetworkError, // 网络连接问题(断网/CORS)
AccessDeniedError, // 权限被拒绝(存储权限/DRM)
ServiceMissingError, // 依赖服务缺失(如云播放服务)
MediaIsPlaylist // 试图播放播放列表项(需选择具体媒体)
};