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();
}
相关推荐
ikoala几秒前
Codex 不得不装的 12 个插件,都在这了
前端·javascript·后端
智者知已应修善业4 分钟前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机
为何创造硅基生物18 分钟前
C++ 独占指针被销毁后,堆也会自己销毁
c++
道友可好26 分钟前
用 Linter 驾驭 AI:机械化执行的艺术
前端·人工智能·后端
EasyDSS28 分钟前
私有化音视频系统/视频直播点播EasyDSS一站式视频平台重构企业全域数字化协作
重构·音视频
C+-C资深大佬29 分钟前
C++ 中的 constexpr与 const区
java·开发语言·c++
流浪码农~32 分钟前
Element Plus DatePicker 动态设置每周起始日
前端·vue.js·elementui
jason_yang34 分钟前
刚发版就背锅?前端版本控制就靠他version-rocket
前端
Tairitsu_H37 分钟前
[LC优选算法#3] 滑动窗口 | 将x减到0的最⼩操作数 | ⽔果成篮 | 字⺟异位词
c++·算法·leetcode·滑动窗口
如果超人不会飞38 分钟前
TinyVue NavMenu导航菜单组件使用指南
前端·vue.js