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

QT音视频

要在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 <QWidget>//前向声明
class QMediaPlayer;
class QSlider;
class QLabel;class Widget : public QWidget
{Q_OBJECTpublic: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 <QMediaPlayer>
#include <QSlider>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QTimer>
#include <QTime>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 <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>class QPushButton;
class QSlider;
class QLabel;class Widget : public QWidget
{Q_OBJECTpublic: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 <QPushButton>
#include <QSlider>
#include <QLabel>
#include <QFileDialog>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QTime>
#include <QMessageBox>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.dtcms.com/a/410157.html

相关文章:

  • Docker 安装 canal 详细步骤
  • 电子信息工程专业课《电路原理》:电子信息世界的基石与语言
  • 中学生做网站的软件狮山公司网站建设
  • 了解Django模型,从基础到实战
  • 【FPGA+DSP系列】——(1)CCS创建工程+LED点亮
  • Windows 作为 Ansible 节点的完整部署流程(含 Docker 部署 Ansible)
  • 今日面试之快问快答:Redis篇
  • 微论-神经网络的亲情密码,权重矩阵的家庭关系论
  • 建个个人网站一年多少钱凡科网网页版登录入口
  • html论坛网站模板小企业网站建设公司
  • 邮件服务器软件哪个好?2025邮件服务器软件推荐
  • langchain-基于agent架构的开发
  • vector深度求索(下)模拟篇
  • 服务器密码错误被锁定如何解决?
  • 远程软件横评:UU远程、ToDesk、向日葵
  • 金仓数据库替代MongoDB:电子证照系统国产化改造实战
  • 关于XLang语言的第三轮答疑
  • 地图网站开发企业网站模板素材
  • Nginx生产环境编译配置升级回退新增模块全解析
  • wordpress 企业站开发wordpress主题配置文件
  • OpenAI携手SAP与微软:推动德国公共部门主权云AI落地
  • NVIDIA Dynamo深度解析:如何优雅地解决LLM推理中的KV缓存瓶颈
  • 三星首款XR头显亮相高通骁龙峰会,微美全息多场景覆盖巩固VR/AR竞争力
  • Redis03-缓存知识点
  • 5网站开发项目经理接到网站开发怎么开展
  • 云原生周刊:K8s 故障排查秘籍
  • D017 vue+django+neo4j音乐知识图谱推荐可视化分析系统|带管理员角色+爬虫
  • 设计模式(C++)详解——迭代器模式(1)
  • 怎么知道网站有没有做301重定向建立网站商城建议
  • 仁寿建设局网站青岛专业网站排名推广