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();
}
相关推荐
禹亮科技9 分钟前
大型国企会议室音视频集成实战:3间120㎡空间Poly G7500+LED大屏+讯飞多语言会议系统落地方案
音视频·视频会议系统集成·上海禹亮科技·讯飞听见多语言会议系统·poly g7500
爱分享的程序猿-Clark24 分钟前
【前端分享】vue开发项目,如何实现 从A页面跳转到B页面,并传值!
前端·javascript·vue.js
breeze jiang1 小时前
从原生事件到 React 组件化:用状态驱动模型加载进度 UI
前端·react.js·ui
徐小夕1 小时前
花了3天,我写了一款开源AI公众号编辑器
前端·vue.js·github
nianniannnn1 小时前
Qt QMessageBox知识点
开发语言·数据库·qt
萌动的小火苗1 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
PBitW1 小时前
git 中容易遗忘的点 (二) ⚡⚡⚡
前端·git·面试
Hilaku1 小时前
2026 年前端大洗牌:React 服务端到 Vite 的底层重构
前端·javascript·程序员
PBitW1 小时前
git 中容易遗忘的点 (三) 🚀🚀🚀
前端·git·面试
名字还没想好☜1 小时前
React setState 连续调用「丢更新」排查:批量更新与函数式更新
前端·javascript·react.js·react·usestate