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();
}