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();
}
相关推荐
艾莉丝努力练剑5 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
Once_day6 小时前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
夜郎king6 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
xmRao6 小时前
Qt+FFmpeg 实现 PCM 音频转 AAC 编码
qt·ffmpeg·pcm
Trouvaille ~6 小时前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
xmRao6 小时前
Qt+FFmpeg 实现录音程序(pcm转wav)
qt·ffmpeg
喜欢喝果茶.6 小时前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
坚果派·白晓明6 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人6 小时前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
晚霞的不甘6 小时前
CANN 编译器深度解析:TBE 自定义算子开发实战
人工智能·架构·开源·音视频