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();
}
相关推荐
10mAh几秒前
【Linux】error while loading shared libraries 怎么解决?——ldd、RPATH 与动态链接排错
java·linux·前端
深念Y5 分钟前
stable-diffusion.cpp 的 FLUX.2 Klein 9B 分步
java·前端·数据库
小帅不太帅9 分钟前
1.5M 参数的 OCR 模型,我把它跑进了浏览器
前端·javascript·ai编程
MC皮蛋侠客16 分钟前
TDengine C++ 系列(5):C/C++ 连接器——连接管理与查询 API
c语言·c++·tdengine
风骏时光牛马18 分钟前
AI编程场景下故障根因分析与复盘总结
前端
MC皮蛋侠客20 分钟前
TDengine C++ 系列(8):流式计算与最新值缓存——库内实时处理
c++·缓存·tdengine
艾莉丝努力练剑37 分钟前
【Qt:问题解决】Qt程序入口点错误修复:MinGW ABI兼容问题
java·服务器·开发语言·qt·文件系统·动静态库
Sterting38 分钟前
Element-Plus 入门与整体布局
前端·vue.js·elementui
程序员黑豆8 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
剪刀石头布啊8 小时前
antd中可编辑表格中巧用useWatch实现联动高性能效果,以及定制延伸学习
前端