Qt 多媒体:快速解决音视频播放问题

5. Qt 音视频

5.1 Qt 音频

核心类

QSound:

  • 仅支持 WAV 格式音频文件
  • 依赖模块:multimedia (需在 .pro 文件中添加 QT += multimedia)。
pro 复制代码
QT += core gui multimedia

5.1.1 核心 API

  • play():开始或继续播放音频。
  • 构造函数:QSound(const QString &filename, QObject *parent = nullptr)(filename 为音频文件路径)。

示例

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QSound>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    
    // 实例化 QSound 对象(音频文件路径为资源文件或绝对路径)
    QSound *sound = new QSound(":/tk.wav", this);
    
    // 点击按钮播放音频
    connect(ui->btn, &QPushButton::clicked, [=]() {
        sound->play();
    });
}

Widget::~Widget() {
    delete ui;
}

5.2 Qt 视频

核心类

  • QMediaPlayer:负责视频解码、播放控制。
  • QVideoWidget:负责视频画面显示。
  • 依赖模块:multimedia 和 multimediawidgets(.pro 文件添加 QT += multimedia multimediawidgets)。
pro 复制代码
QT += core gui multimedia multimediawidgets

5.2.1 核心 API

QMediaPlayer 核心方法

方法 说明
setMedia(const QMediaContent& media) 设置视频源(QMediaContent 可通过 QUrl 构造)
setVideoOutput(QVideoWidget *widget) 绑定视频显示控件
play() 开始播放
pause() 暂停播放
stop() 停止播放

示例

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QPushButton>
#include <QFileDialog>

class Widget : public QWidget {
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void chooseVideo(); // 选择视频槽函数
private:
    QMediaPlayer *mediaPlayer; // 媒体播放器
    QVideoWidget *videoWidget; // 视频显示控件
    QVBoxLayout *vbox; // 垂直布局
    QPushButton *chooseBtn; // 选择视频按钮
    QPushButton *playBtn; // 播放按钮
};

#endif // WIDGET_H

widget.cpp

cpp 复制代码
#include "widget.h"
#include <QStyle>

Widget::Widget(QWidget *parent) : QWidget(parent) {
    // 实例化核心对象
    mediaPlayer = new QMediaPlayer(this);
    videoWidget = new QVideoWidget(this);
    chooseBtn = new QPushButton("选择视频", this);
    playBtn = new QPushButton(this);
    
    // 配置视频显示控件大小
    videoWidget->setMinimumSize(600, 600);
    
    // 配置播放按钮图标(使用系统默认图标)
    playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));
    
    // 布局管理
    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addWidget(chooseBtn);
    hbox->addWidget(playBtn);
    
    vbox = new QVBoxLayout(this);
    vbox->addWidget(videoWidget);
    vbox->addLayout(hbox);
    this->setLayout(vbox);
    
    // 绑定选择视频槽函数
    connect(chooseBtn, &QPushButton::clicked, this, &Widget::chooseVideo);
}

void Widget::chooseVideo() {
    // 选择视频,返回一个播放视频的路径(修正为打开文件对话框)
    QString name = QFileDialog::getOpenFileName(this, "选择视频", ".", "WMV(*.wmv);;所有文件(*.*)");
    
    // 设置媒体源
    mediaPlayer->setMedia(QUrl::fromLocalFile(name));
    
    // 输出视频画面
    mediaPlayer->setVideoOutput(videoWidget);
    
    // 播放
    mediaPlayer->play();
}
相关推荐
天蓝色的鱼鱼1 小时前
关于 CSS 你可能不知道的属性,但关键时刻很有用
前端·css
泯泷2 小时前
第 2 篇:设计第一套字节码:Opcode、Instruction 与 Constant Pool
前端·javascript·安全
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
泯泷2 小时前
第 1 篇:从 1 + 2 开始:亲手写出第一台 JSVM
前端·javascript·安全
团团崽_七分甜2 小时前
Spring Boot 核心知识点总结
前端
lichenyang4532 小时前
从一个按钮开始,理解 ASCF 框架到底在做什么
前端
古夕2 小时前
第三方 SSO 接入实践:redirect_uri 编码、回调一致性与跨项目联调
前端·vue.js
朦胧之2 小时前
页面白屏卡住排查方法
前端·javascript
用户593608741402 小时前
Playwright 黑魔法:用 ClipboardEvent 绕过 React 富文本编辑器
前端
石山岭3 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端