不仅可以播放mp3音频文件,也可以播放视频文件(如 .mp4、.avi 等),但应该与QVideoWidget 配合使用以显示视频画面。

news/2025/10/22 17:44:51/文章来源:https://www.cnblogs.com/wzzkaifa/p/19158583

要在Qt项目中使用Qt多媒体模块,需要在项目配置文件中添加如下语句:Qt += multimedia,如果在项目中使用视频播放功能,还需要添加,Qt += multimediawidgets来使用QVideoWidget或QGraphicsVideoItem进行视频播放。

Qt多媒体模块包含多个类,下面是需要用到的主要类:

音频

相关的类

音频播放会使用如下两个类:

  • QMediaPlayer类:媒体播放器,主要用于播放歌曲、网络收音机等功能;

  • QMediaPlaylist类:专用于播放媒体内容的列表。

音频小项目

实现一个简易MP3播放器,功能如下:

  • 可以选择本地本地mp3格式文件;

  • 可以对设置播放、停止、暂停播放;

  • 调节音量大小、调整播放进度;

  • 显示播放时长以及总时长;

需要在.pro文件中加入QT       += core gui multimedia

#ifndef WIDGET_H
#define WIDGET_H
#include 
//前向声明
class QMediaPlayer;
class QSlider;
class QLabel;
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
private slots://打开文件void openFile();//设置音量void setVolume(int value);//更新进度条的位置void updatePosition();//更新进度条的范围void updateDuration(qint64 duration);//设置进度条的位置void seekPosition();
private:QMediaPlayer *m_player;//媒体播放器QSlider *m_volumeSlider;//声音滑动条QSlider *m_positionSlider;//进度滑动条QLabel *m_timeLabel;//时间标签
};
#endif // WIDGET_H
#include "widget.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
Widget::Widget(QWidget *parent): QWidget(parent)
{setWindowTitle("MP3音频播放器");resize(400, 300);//初始化播放器m_player = new QMediaPlayer(this);//创建四个按钮分别显示"打开文件"、"播放"、"暂停","停止"QPushButton *openButton = new QPushButton("打开文件");QPushButton *playButton = new QPushButton("播放");QPushButton *pauseButton = new QPushButton("暂停");QPushButton *stopButton = new QPushButton("停止");//声音滑动条m_volumeSlider = new QSlider(Qt::Horizontal);//进度滑动条m_positionSlider = new QSlider(Qt::Horizontal);//时间标签(当前播放时长/总时长)m_timeLabel = new QLabel("00:00/00:00");// 设置音量滑动条范围和初始值m_volumeSlider->setRange(0, 100);m_volumeSlider->setValue(50);//设置播放音量m_player->setVolume(30);//启用播放进度条m_positionSlider->setEnabled(true);//设置播放进度的范围m_positionSlider->setRange(0, 100);// 布局QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(openButton);layout->addWidget(playButton);layout->addWidget(pauseButton);layout->addWidget(stopButton);layout->addWidget(new QLabel("音量:"));layout->addWidget(m_volumeSlider);layout->addWidget(new QLabel("进度:"));layout->addWidget(m_positionSlider);layout->addWidget(m_timeLabel);setLayout(layout);// 连接信号与槽connect(openButton, &QPushButton::clicked, this, &Widget::openFile);connect(playButton, &QPushButton::clicked, m_player, &QMediaPlayer::play);connect(pauseButton, &QPushButton::clicked, m_player, &QMediaPlayer::pause);connect(stopButton, &QPushButton::clicked, m_player, &QMediaPlayer::stop);connect(m_volumeSlider, &QSlider::valueChanged, this, &Widget::setVolume);connect(m_player, &QMediaPlayer::positionChanged, this, &Widget::updatePosition);connect(m_player, &QMediaPlayer::durationChanged, this, &Widget::updateDuration);//连接进度条拖动信号connect(m_positionSlider, &QSlider::sliderReleased, this, &Widget::seekPosition);//定时器用于更新进度条QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &Widget::updatePosition);//每1秒更新一次timer->start(1000);
}
Widget::~Widget()
{
}
void Widget::openFile()
{QString filePath =QFileDialog::getOpenFileName(this, "打开mp3文件","", "MP3文件(*.mp3)");if(!filePath.isEmpty()){m_player->setMedia(QUrl::fromLocalFile(filePath));//打开即播放m_player->play();}
}
void Widget::setVolume(int value)
{m_player->setVolume(value);
}
void Widget::updatePosition()
{// 如果用户正在拖动进度条,则跳过自动更新if(m_positionSlider->isSliderDown())return;if(m_player->duration() > 0){//将播放进度转换为百分比形式,这是乘以100的作用,不然就是小数int position = (m_player->position() * 100)/m_player->duration();m_positionSlider->setValue(position);// 更新时间显示//当前时间,使用position获取QTime currentTime(0, 0);currentTime = currentTime.addMSecs(m_player->position());//总时间,使用duration获取QTime totalTime(0, 0);totalTime = totalTime.addMSecs(m_player->duration());m_timeLabel->setText(currentTime.toString("mm:ss")+ "/" + totalTime.toString("mm:ss"));}
}
void Widget::updateDuration(qint64 duration)
{Q_UNUSED(duration);m_positionSlider->setRange(0, 100);
}
void Widget::seekPosition()
{if(m_player->duration() > 0){//计算目标位置(毫秒)= 进度条百分比 × 总时长/100qint64 targetPos =(m_positionSlider->value() * m_player->duration())/100;//设置播放位置m_player->setPosition(targetPos);}
}

测试结果

视频

相关的类

视频播放会使用如下两个类:

  • QMediaPlayer类:高级视频播放器综合应用;

  • QVideoWidget类:用于媒体对象生成的视频。

QMediaPlayer类介绍

不仅可以播放mp3音频文件,也可以播放视频文件(如 .mp4、.avi 等),但需要与QVideoWidget 配合使用以显示视频画面。

视频小项目

需要在.pro文件中加入QT       += core gui multimedia multimediawidgets

#ifndef WIDGET_H
#define WIDGET_H
#include 
#include 
#include 
class QPushButton;
class QSlider;
class QLabel;
class Widget : public QWidget
{Q_OBJECT
public:explicit Widget(QWidget *parent = nullptr);
private slots://打开文件void openFile();//更新进度条的位置void updatePosition(qint64 position);//更新进度条范围void updateDuration(qint64 duration);//设置进度条的位置void setPosition(int position);
private:QMediaPlayer *m_player;//视频播放器QVideoWidget *m_videoWidget;//视频输出组件QPushButton  *m_openButton;//打开文件按钮QPushButton  *m_playButton;//播放按钮QPushButton  *m_pauseButton;//暂停按钮QPushButton  *m_stopButton;//停止按钮QSlider      *m_positionSlider;//进度条QSlider      *m_volumeSlider;//声音条QLabel       *m_timeLabel;//进度时间标签
};
#endif // WIDGET_H
#include "widget.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
Widget::Widget(QWidget *parent): QWidget(parent)
{setWindowTitle("MP4视频播放器");resize(800, 700);//初始化播放器组件m_player = new QMediaPlayer(this);m_videoWidget = new QVideoWidget(this);//设置视频输出m_player->setVideoOutput(m_videoWidget);// 创建控制按钮m_openButton = new QPushButton("打开文件");m_playButton = new QPushButton("播放");m_pauseButton = new QPushButton("暂停");m_stopButton = new QPushButton("停止");//进度条和音量控制m_positionSlider = new QSlider(Qt::Horizontal);m_volumeSlider = new QSlider(Qt::Horizontal);m_volumeSlider->setRange(0, 100);m_volumeSlider->setValue(50);m_timeLabel = new QLabel("00:00/00:00");//主布局QVBoxLayout *mainLayout = new QVBoxLayout;mainLayout->addWidget(m_videoWidget);//控制按钮布局QGridLayout *gridLayout = new QGridLayout;gridLayout->addWidget(m_openButton, 0, 0, 1, 3);gridLayout->addWidget(m_playButton, 0, 3, 1, 3);gridLayout->addWidget(m_pauseButton, 0, 6, 1, 3);gridLayout->addWidget(m_stopButton, 0, 9, 1, 3);gridLayout->addWidget(new QLabel("音量:"), 0, 12);gridLayout->addWidget(m_volumeSlider, 0, 13, 1, 6);gridLayout->addWidget(new QLabel("进度:"), 1, 0);gridLayout->addWidget(m_positionSlider, 1, 1, 1, 18);gridLayout->addWidget(m_timeLabel, 2, 0, 1, 19);mainLayout->addLayout(gridLayout);m_timeLabel->setFixedHeight(50);m_timeLabel->setAlignment(Qt::AlignCenter); //保持文字居中setLayout(mainLayout);//信号槽连接connect(m_openButton, &QPushButton::clicked, this, &Widget::openFile);connect(m_playButton, &QPushButton::clicked, m_player, &QMediaPlayer::play);connect(m_pauseButton, &QPushButton::clicked, m_player, &QMediaPlayer::pause);connect(m_stopButton, &QPushButton::clicked, m_player, &QMediaPlayer::stop);connect(m_volumeSlider, &QSlider::valueChanged, m_player, &QMediaPlayer::setVolume);connect(m_positionSlider, &QSlider::sliderMoved, this, &Widget::setPosition);connect(m_player, &QMediaPlayer::positionChanged, this, &Widget::updatePosition);connect(m_player, &QMediaPlayer::durationChanged, this, &Widget::updateDuration);
}
// 打开视频文件
void Widget::openFile()
{QString fileName =QFileDialog::getOpenFileName(this, "选择视频文件", QDir::homePath(), "视频文件 (*.mp4 *.avi *.mkv *.mov)");if (!fileName.isEmpty()){m_player->setMedia(QUrl::fromLocalFile(fileName));m_player->play();}
}
//更新播放进度显示
void Widget::updatePosition(qint64 position)
{m_positionSlider->setValue(position);// 更新时间标签QTime currentTime(0, 0, 0);currentTime = currentTime.addMSecs(position);QTime totalTime(0, 0, 0);totalTime = totalTime.addMSecs(m_player->duration());m_timeLabel->setText(currentTime.toString("hh:mm:ss")+ "/" + totalTime.toString("hh:mm:ss"));
}
// 更新总时长
void Widget::updateDuration(qint64 duration)
{m_positionSlider->setRange(0, duration);
}
//手动设置播放位置
void Widget::setPosition(int position)
{m_player->setPosition(position);
}

注意:部分同学使用上述代码后看不到视频播放,这里需要安装解码工具LAV Filters(lav解码器),不然看不到视频的播放功能,软件名avfilters_0.73.1.exe。直接网上搜就行

测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【IEEE出版、往届会后3个月检索】2025 第九届控制工程与先进算法国际论坛(IWCEAA 2025)

2025 第九届控制工程与先进算法国际论坛(IWCEAA 2025) 9th International Workshop on Control Engineering and Advanced Algorithms 高届数会议!IWCEAA 2024已于会后3个多月完成见刊检索 本届会议已申请到IEEE出版,…

设计模式(C++)详解——命令模式(1) - 指南

设计模式(C++)详解——命令模式(1) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

整装定制家具生产厂家口碑榜:TOP3企业智能制造实力深度解析

随着家居产业升级和消费需求变革,整装定制家具市场呈现快速增长态势。行业数据显示,2024年中国定制家具市场规模预计突破4800亿元,智能制造渗透率已达65%以上。本文基于企业生产能力、技术研发水平、数字化建设及服…

实用指南:阿里云安装Docker

实用指南:阿里云安装Dockerpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

给大家分享三个特别好用的在线工具,可以为你的工作节省很多时间

给大家分享三个特别好用的在线工具,可以为你的工作节省很多时间 有工具需求的,大家可以点赞收藏一下 1.All to All 一个万能的在线格式转换站,文件类型覆盖特别全,而且是免费的 无论你是要把文档变成PDF、图片转成…

2025 年振动筛源头厂家最新推荐榜单:权威甄选实验 / 防爆 / 精细筛分设备,揭秘靠谱供应企业

引言 2025 年全球振动筛市场规模持续扩大,设备需求已延伸至矿业、化工、食品、环保等数十个领域,但市场乱象却让企业采购陷入困境。行业集中度低、中小厂家扎堆,部分企业缺乏核心技术,导致设备存在筛分效率低、能耗…

2025 年最新推荐摇摆筛厂家榜单:聚焦实力雄厚供货稳定品牌,助力企业精准选购筛分设备方形/圆形/石英砂/砂石/精细摇摆筛厂家推荐

引言 在当前工业生产快速发展的背景下,摇摆筛作为物料处理关键设备,市场需求持续增长,但同时也面临品牌繁杂、产品质量良莠不齐的局面。众多企业在选购时,常遭遇设备筛分效率低、定制化能力不足、售后响应慢等问题…

江苏国际陆运物流公司口碑榜:TOP7企业服务能力全景解析

在长三角一体化发展战略推动下,江苏省作为制造业重镇,其国际陆运物流需求呈现持续增长态势。行业统计数据显示,2024年江苏省国际物流市场规模预计突破2800亿元,其中陆运业务占比达42%。本文基于企业服务网络、运营…

高性能超低功耗蓝牙电子价签方案 OM6626 NRF52832

方案介绍 在智慧零售浪潮席卷全球的今天,电子价签(ESL)正迅速取代传统纸质标签,成为门店数字化升级的核心入口。而驱动这场静默革命的核心引擎,正是依靠高性能超低功耗蓝牙系统级芯片(SoC)。 ​方案推荐芯片 电…

软工第三次作业-结对项目

软工第三次作业 小组成员 3123004287肖锦瑞 3123004268黄泽鹏 Github 仓库链接这个作业属于哪个课程 软件工程这个作业要求在哪里作业要求 作业要求这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序PSP 表…

2025 年中国校服厂家最新推荐榜单权威发布!深度解析优质品牌核心竞争力与选择指南

引言 我国中小学在校生规模已达 2.5 亿人,校服作为学生日常必备服饰,其品质与体验直接关系到千万家庭。然而当前市场仍存诸多痛点:部分产品面料安全不达标、版型不合身,洗后易变形褪色;设计同质化严重,既缺乏校园…

【IEEE出版 | EI检索稳定】第五届IEEE能源工程与电力系统国际学术会议(IEEE-EEPS 2025)

第五届IEEE能源工程与电力系统国际学术会议(IEEE-EEPS 2025),将于2025年10月31-11月2日在深圳召开。【IEEE冠名会议 | EI检索稳定】 【香港中文大学(深圳)主办】 第五届IEEE能源工程与电力系统国际学术会议(IEEE…

2025 年同步带厂家推荐:深入剖析浙江三星胶带有限公司,探寻橡胶带行业的优质之选

行业背景 在当今工业蓬勃发展的时代,汽车、摩托车、工业和农业机械设备、家用电器等领域持续扩张。传动胶带作为这些行业设备运转的关键零部件,其需求呈现出爆发式增长。市场对胶带产品的性能要求愈发严苛,不仅追求…

深夜的调试界面,藏着微信生态的黄金密码

2017年的夏天,广州的出租屋格外闷热。我对着电脑屏幕上的 PHP 代码敲到凌晨两点,烟灰缸里的烟蒂堆成了小山,心里却满是焦虑。作为一名刚入行三年的 PHP 开发者,我正陷入职业瓶颈:接的外包项目要么是重复的企业官网…

【题解】洛谷 P4096 [HEOI2013] Eden 的博弈树 | 更简洁的一种做法

洛谷 P4096 [HEOI2013] Eden 的博弈树,一种由 xzm 大神提供的更简洁做法。 首先需要从下往上求出以 \(i\) 为根的子树先后手的最小必胜集合大小,记为 \(f_{i,0/1}\)(\(0\) 为先手,\(1\) 为后手)。此外在转移同时维…

2025年丝杆升降机厂家最新行业推荐:联动丝杆升降机/螺旋丝杆升降机/蜗杆丝杆升降机/蜗轮丝杆升降机/三家兼顾工艺与适配性的实力厂家推荐

随着工业自动化领域对传动设备精度与适配性需求的不断提升,丝杆升降机作为关键传动部件,其生产厂家的工艺积累与场景适配能力愈发受到关注。以下三家厂家在丝杆升降机、螺旋升降机等品类的研发与生产中表现突出,其核…

智能配电变压器生产厂家口碑榜:基于技术实力、客户服务及市场反馈的专业评估

在智能电网建设快速推进的背景下,智能配电变压器作为配电网的核心设备,其技术水平和产品质量直接影响供电可靠性与能效水平。行业数据显示,2024年我国智能配电变压器市场规模预计将达到186亿元,年均复合增长率保持…

力扣300.最长递增子序列(经典dp)力扣375.猜数字II力扣.329矩阵最长的递增子序列力扣.33搜索旋转排序数组 - 详解

力扣300.最长递增子序列(经典dp)力扣375.猜数字II力扣.329矩阵最长的递增子序列力扣.33搜索旋转排序数组 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

Meta DINO系列论文浅读

Meta AI的DINO系列(DINO、DINOv2、DINOv3)代表了自监督视觉表示学习领域的重大进展。本报告系统性地分析了该系列模型的技术演进路径,从自监督学习的基础概念和传统方法的局限性出发,深入阐述了DINOv1、DINOv2和DI…

qemu模拟嵌入式开发板运行linux

单片机的:单片机模拟器 - JeasonBoy - 博客园mini2440imx6ullraspberry