当前位置: 首页 > news >正文

Qt——多媒体(音频、视频播放)

播放音频

要使用多媒体音频功能,需要先引入multimedia模块

camke中,加入如下语句:

find_package(Qt6 COMPONENTS Network REQUIRED)
target_link_libraries(your_target_name PRIVATE Qt6::multimedia)

播放音频主要涉及到三个类:

QAudioOutput音频输出类,和**QMediaPlayer**搭配使用

方法功能
setVolume设置音量

QMediaPlayer媒体播放器,主要用于长音频输出

方法功能
setAudioOutput设置音频输出
setSource设置资源文件
play开始播放
pause暂停播放,恢复播放时,从暂停的地方继续
stop停止播放,恢复播放时,从头开始播放

QSoundEffct声音播放器,主要用于短音频输出。其不需要搭配QAudioOutput使用

方法功能
setSource设置资源文件
play开始播放
setVolume设置音量

例如,可以实现一个简单的音乐播放器,包含如下功能

  • 从本地选择歌曲
  • 播放/暂停歌曲
  • 显示歌曲播放进度
  • 点击进度条,实现快进

Widget

// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QMediaPlayer>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void on_toolButton_clicked();void updateProgressBar(qint64 position);void updateSong(int percent);private:Ui::Widget *ui;QMediaPlayer *player_ = nullptr;
};
#endif  // WIDGET_H// widget.cpp
#include "widget.h"#include <QAudioOutput>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
#include <thread>#include "./ui_widget.h"
#include "progressbar.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 创建音频输出QAudioOutput *audio_output = new QAudioOutput(this);// 创建播放器,并设置资源和输出player_ = new QMediaPlayer(this);player_->setAudioOutput(audio_output);// 设置音量大小audio_output->setVolume(20);// 设置播放键初始图标和状态ui->toolButton->setCheckable(false);ui->toolButton->setIcon(QIcon(":/play"));// 设置进度条基本信息ui->progressBar->setValue(0);ui->progressBar->setMinimum(0);ui->progressBar->setMaximum(1000);ui->progressBar->setTextVisible(false);// 监控播放错误connect(player_, &QMediaPlayer::errorOccurred,[this](QMediaPlayer::Error error, const QString &errorString) {qDebug() << "Error:" << errorString;QMessageBox::warning(this, "播放错误", errorString);});// 监控播放进度connect(player_, &QMediaPlayer::positionChanged, this, &Widget::updateProgressBar);// 监控进度条变化connect(ui->progressBar, &ProgressBar::updateSong, this, &Widget::updateSong);
}Widget::~Widget() { delete ui; }void Widget::on_pushButton_clicked() {QString path = QFileDialog::getOpenFileName();player_->setSource(QUrl::fromLocalFile(path));int index = path.lastIndexOf('/');QString song;if (index != -1) {song = path.mid(index + 1);}ui->label->setText("当前正在播放: " + song);ui->progressBar->setValue(0);  // 初始化进度条
}void Widget::on_toolButton_clicked() {if (ui->toolButton->isCheckable() == true) {// 暂停音乐ui->toolButton->setIcon(QIcon(":/play"));ui->toolButton->setCheckable(false);player_->pause();} else {// 播放音乐ui->toolButton->setIcon(QIcon(":/pause"));ui->toolButton->setCheckable(true);player_->play();}
}// 根据播放进度, 更新进度条
void Widget::updateProgressBar(qint64 position) {qint64 total_len = player_->duration();ui->progressBar->setValue(1000 * position / total_len);
}// 根据进度条,更新播放进度
void Widget::updateSong(int percent) {qDebug() << percent;qint64 cur_position = player_->duration() * percent / 100;player_->setPosition(cur_position);
}

progressBar

// progressBar.h
#ifndef PROGRESSBAR_H
#define PROGRESSBAR_H#include <QMouseEvent>
#include <QProgressBar>class ProgressBar : public QProgressBar {Q_OBJECTpublic:ProgressBar(QWidget* parent = nullptr);void mousePressEvent(QMouseEvent* event);signals:void updateSong(int percent);
};#endif  // PROGRESSBAR_H// progressBar.cpp
#include "progressbar.h"ProgressBar::ProgressBar(QWidget* parent) : QProgressBar(parent) {}void ProgressBar::mousePressEvent(QMouseEvent* event) {int pos = event->x();int width = this->width();this->setValue(this->maximum() * pos / width);emit updateSong(100 * pos / width);
}

播放视频

要使用多媒体视频功能,需要先引入模块:multimediawidgets

CMakeLists.txt中加入如下语句:

find_package(Qt6 REQUIRED COMPONENTS MultimediaWidgets) 
target_link_libraries(mytarget PRIVATE Qt6::MultimediaWidgets)

主要涉及到三个类:

QVideoWidget,作为视频播放的载体,配合 QMediaPlayer 实现完整的视频播放功能。

方法功能
setFullScreen设置全屏
setBrightness()调节亮度
setContrast调节对比度

QAudioOutput音频输出类,和**QMediaPlayer**搭配使用

方法功能
setVolume设置音量

QMediaPlayer媒体播放器

方法功能
setVideoOutput设置视频输出
setSource设置资源文件
play开始播放
pause暂停播放,恢复播放时,从暂停的地方继续
stop停止播放,恢复播放时,从头开始播放

实例:

// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QMediaPlayer>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;QMediaPlayer *player_ = nullptr;
};
#endif  // WIDGET_H// widget.cpp
#include "widget.h"#include <QAudioOutput>
#include <QFileDialog>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QVideoWidget>#include "./ui_widget.h"Widget::Widget(QWidget* parent) : QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// qputenv("QT_MEDIA_BACKEND", "windows");  // Windows 平台使用软件解码// 创建视频播放载体QVideoWidget* video_widget = new QVideoWidget(this);// 创建音频播放载体QAudioOutput* audio_output = new QAudioOutput(this);// 创建播放器player_ = new QMediaPlayer(this);player_->setVideoOutput(video_widget);player_->setAudioOutput(audio_output);player_->audioOutput()->setVolume(20);// 设置垂直布局QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(video_widget);layout->addWidget(ui->pushButton);this->setLayout(layout);connect(player_, &QMediaPlayer::errorOccurred, this,[this](QMediaPlayer::Error error, const QString& errorString) {qDebug() << "ERROR: " << errorString;QMessageBox::critical(this, "播放视频", errorString);exit(-1);});
}Widget::~Widget() { delete ui; }void Widget::on_pushButton_clicked() {QString path = QFileDialog::getOpenFileName();player_->setSource(QUrl::fromLocalFile(path));player_->play();
}
http://www.dtcms.com/a/350127.html

相关文章:

  • 艾利特石油管道巡检机器人:工业安全的智能守护者
  • 系统数据库
  • WRC2025 | 澳鹏亮相2025世界机器人大会,以数据之力赋能具身智能新纪元
  • 2025年9月计算机二级C++语言程序设计——选择题打卡Day6
  • 神经网络模型搭建及手写数字识别案例
  • 关于“程序=数据结构+算法”的深层认识
  • Java图形图像处理【双缓冲技术与游戏】【九】
  • Java全栈开发面试实战:从基础到微服务的深度解析
  • IDEA2022开启新版UI
  • 系统架构设计师备考第4天——计算机软件概述操作系统
  • Aligning Effective Tokens with Video Anomaly in Large Language Models
  • 储能防逆流:智能守护电网稳定的核心技术
  • 大数据毕业设计选题推荐-基于大数据的餐饮服务许可证数据可视化分析系统-Spark-Hadoop-Bigdata
  • 阿里云OSS文件上传_对象存储服务全流程
  • Android横竖屏切换的“数据保卫战”:如何优雅地保存和恢复表单数据
  • 用 python 开发一个可调用工具的 AI Agent,实现电脑配置专业评价_python ai agent
  • 常见前端性能优化讲解
  • 在分布式计算区域中通过VPC搭建私有网络
  • Ansible 任务控制与事实管理指南:从事实收集到任务流程掌控
  • Hadoop(四)
  • 【GPT入门】第59课 大模型内存计算指南:7B/8B/70B 模型在 32/16/8/4bit 精度下的内存需求测算
  • 【GPT5的多个子模型和动态路由分别是什么?】
  • 深度学习分类网络初篇
  • AI与自动化工具对比与选择
  • Coze用户账号设置修改用户密码-前端源码
  • 用一根“数据中枢神经”串起业务从事件流到 Apache Kafka
  • Flume中常见的易错的问题
  • Linux应用软件编程---网络编程(TCP:[ 其他机制、头部标志位、应用示例 ]、 HTTP:[ 万维网、概念、格式、报文、应用示例 ]
  • LoRA 微调后幻觉排查 Checklist
  • JVM之【执行引擎系统】