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

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

要在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.jsqmd.com/news/19664/

相关文章:

  • 【IEEE出版、往届会后3个月检索】2025 第九届控制工程与先进算法国际论坛(IWCEAA 2025)
  • 设计模式(C++)详解——命令模式(1) - 指南
  • 整装定制家具生产厂家口碑榜:TOP3企业智能制造实力深度解析
  • 实用指南:阿里云安装Docker
  • 给大家分享三个特别好用的在线工具,可以为你的工作节省很多时间
  • 2025 年振动筛源头厂家最新推荐榜单:权威甄选实验 / 防爆 / 精细筛分设备,揭秘靠谱供应企业
  • 2025 年最新推荐摇摆筛厂家榜单:聚焦实力雄厚供货稳定品牌,助力企业精准选购筛分设备方形/圆形/石英砂/砂石/精细摇摆筛厂家推荐
  • 江苏国际陆运物流公司口碑榜:TOP7企业服务能力全景解析
  • 高性能超低功耗蓝牙电子价签方案 OM6626 NRF52832
  • 软工第三次作业-结对项目
  • 2025 年中国校服厂家最新推荐榜单权威发布!深度解析优质品牌核心竞争力与选择指南
  • 【IEEE出版 | EI检索稳定】第五届IEEE能源工程与电力系统国际学术会议(IEEE-EEPS 2025)
  • 2025 年同步带厂家推荐:深入剖析浙江三星胶带有限公司,探寻橡胶带行业的优质之选
  • 深夜的调试界面,藏着微信生态的黄金密码
  • 【题解】洛谷 P4096 [HEOI2013] Eden 的博弈树 | 更简洁的一种做法
  • 2025年丝杆升降机厂家最新行业推荐:联动丝杆升降机/螺旋丝杆升降机/蜗杆丝杆升降机/蜗轮丝杆升降机/三家兼顾工艺与适配性的实力厂家推荐
  • 智能配电变压器生产厂家口碑榜:基于技术实力、客户服务及市场反馈的专业评估
  • 力扣300.最长递增子序列(经典dp)力扣375.猜数字II力扣.329矩阵最长的递增子序列力扣.33搜索旋转排序数组 - 详解
  • Meta DINO系列论文浅读
  • qemu模拟嵌入式开发板运行linux
  • 2025年知名的工业铝型材深加工加工厂
  • Apache Tika严重XXE漏洞分析与修复方案
  • 防火密封胶条生产厂家口碑榜:基于技术实力、客户服务及市场反馈的专业评估
  • SAP ALV小数位去除
  • 【WCH蓝牙系列芯片】-基于CH585开发板——BLE蓝牙广播----扩展广播应用
  • 茶桌茶台生产厂家口碑榜:TOP3企业综合实力全景解析
  • 回转窑式干燥机生产厂家口碑榜:基于技术实力、客户服务及市场反馈的专业评估
  • FileZilla Pro 破解版
  • 详细介绍:【实时Linux实战系列】jemalloc/tcmalloc 与内存池:碎片与暂停时间控制
  • CF1508C tj