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          // 试图播放播放列表项(需选择具体媒体)
};
在网上找了一个别人的旧版本的播放器~自己更改了一天,终于可运行了,希望分享下同共学习; 不过出了少少问题:希望有经验的一起指导下: 运行环境:qt creator +windows 1、原计划是可支持视频播放的,现在只能加载间频(mp3),一加载视频就卡死 2.、自定义的进度条不起作用,不知为什么百分比槽连接不成功 connect(wmp, SIGNAL(PositionChange(double, double)),this, SLOT(Slot_onPositionChange(double, double))); 3、我用的是QAxWidget控件,这个是不是只支持windows的呢?或者还有没其实更好的? /******************************************************************************************* 项目名:QT播放器 Qt Mediaplayer 工程师:枫儿 完成时间:2009年12月28日 技术支持:嵌入式家园 www.studyarm.cn www.mcupark.com *******************************************************************************************/ #include "playerwindow.h" #include #include #include #include #include #include #include #include PlayerWindow::PlayerWindow() { //setCaption(tr("Media Player")); fileFilters = tr("Video files (*.mpg *.mpeg *.avi *.wmv)\n" //原来字符串换行也可这样用 "Audio files (*.mp3 *.wav)"); updateTimer = 0; setMouseTracking(true); this->wmp = new QAxWidget(this); wmp->setControl("{22D6F312-B0F6-11D0-94AB-0080C74C7E95}"); // wmp->setProperty("ShowControls", QVariant(false, 0)); wmp->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); connect(wmp, SIGNAL(PlayStateChange(int, int)),this, SLOT(Slot_onPlayStateChange(int, int))); connect(wmp, SIGNAL(ReadyStateChange(ReadyStateConstants)),this, SLOT(Slot_onReadyStateChange(ReadyStateConstants))); connect(wmp, SIGNAL(PositionChange(double, double)),this, SLOT(Slot_onPositionChange(double, double))); this->openButton = new QPushButton(tr("&Open")); connect(openButton, SIGNAL(clicked()), this, SLOT(Slot_openFile())); this->playPauseButton = new QPushButton(tr("&Play")); connect(playPauseButton, SIGNAL(clicked()), wmp, SLOT(Play())); this->stopButton = new QPushButton(tr("&Stop")); connect(stopButton, SIGNAL(clicked()), wmp, SLOT(Stop())); this->seekSlider = new QSlider(Qt::Horizontal, this); seekSlider->setEnabled(false); connect(seekSlider, SIGNAL(valueChanged(int)),this, SLOT(Slot_sliderValueChanged(int))); connect(seekSlider, SIGNAL(sliderPressed()),wmp, SLOT(Pause())); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(openButton); buttonLayout->addWidget(playPauseButton); buttonLayout->addWidget(stopButton); QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(wmp); mainLayout->addLayout(buttonLayout); mainLayout->addWidget(seekSlider); this->setLayout(mainLayout); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序先锋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值