Qt 实现简易的视频播放器,功能选择视频,播放,暂停,前进,后退,进度条拖拉,视频时长显示
1.效果图

2.代码实现
2.1 .pro文件
QT += core gui multimedia multimediawidgets
2.2 .h文件
#ifndef VIDEOPLAYING_H
#define VIDEOPLAYING_H#include <QWidget>
#include<QFileDialog>#include<QMediaPlayer>
#include<QMediaRecorder>
#include<QVideoWidget>#include <QWidget>
#include <QHBoxLayout> //水平布局
#include <QVBoxLayout> //垂直布局
#include <QVideoWidget> //显示视频
#include <QMediaPlayer> //播放声音
#include <QPushButton> //按钮
#include <QSlider> //滑动条
#include <QStyle> //设置图标
#include <QFileDialog> //选择文件/文件夹
#include<QAudioOutput>
namespace Ui {
class VideoPlaying;
}class VideoPlaying : public QWidget
{Q_OBJECTpublic:explicit VideoPlaying(QWidget *parent = nullptr);~VideoPlaying();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_4_clicked();void on_pushButton_5_clicked();void updateSliderPosition();void on_horizontalSlider_sliderPressed();void on_horizontalSlider_sliderMoved(int position);void on_horizontalSlider_sliderReleased();private:Ui::VideoPlaying *ui;QVideoWidget * m_videoWidget;//输出设备QMediaPlayer * m_player; // 声明 QMediaPlayer 对象QString m_video_filePath;// 设置音频角色为视频QAudioOutput* m_audioOutput;// 创建音频输出对象qint64 m_time;bool is_play;bool is_slider;QString getTime(qint64 time);
};#endif // VIDEOPLAYING_H
2.3 .cpp文件
#include "videoplaying.h"
#include "ui_videoplaying.h"VideoPlaying::VideoPlaying(QWidget *parent): QWidget(parent), ui(new Ui::VideoPlaying)
{ui->setupUi(this);m_player = new QMediaPlayer(this); // 初始化 QMediaPlayer 对象m_videoWidget = new QVideoWidget(this);QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(m_videoWidget);ui->widget->setLayout(layout);m_player->setVideoOutput(m_videoWidget);m_audioOutput=new QAudioOutput(this);m_player->setAudioOutput(m_audioOutput); // 设置音频输出connect(m_player, &QMediaPlayer::positionChanged, this, &VideoPlaying::updateSliderPosition);}VideoPlaying::~VideoPlaying()
{delete ui;
}//选择视频
void VideoPlaying::on_pushButton_clicked()
{QString filename = QFileDialog::getOpenFileName(this, "选择视频", "", "Video Files (*.mp4 *.avi *.mkv)");if (!filename.isEmpty()) {qDebug() << "选择的视频文件路径:" << filename;m_video_filePath=filename;m_player->setSource(m_video_filePath);m_time= m_player->duration(); // 获取视频时长,单位为毫秒ui->lineEdit->setText(m_video_filePath);ui->label_all->setText(getTime(m_time));ui->label_now->setText("00:00:00");}}//播放
void VideoPlaying::on_pushButton_2_clicked()
{if (!m_video_filePath.isEmpty()) {QUrl videoUrl = QUrl::fromLocalFile(m_video_filePath);m_player->play(); // 开始播放视频} else {qDebug() << "请先选择视频文件";}}//暂停
void VideoPlaying::on_pushButton_3_clicked()
{// m_player->stop();m_player->pause(); // 暂停播放}//前进
void VideoPlaying::on_pushButton_4_clicked()
{qint64 position = m_player->position(); // 获取当前播放位置position += 5000; // 向后退5秒(单位为毫秒)if (position < 0) {position = 0; // 不能倒退到负值}m_player->setPosition(position); // 设置视频播放位置}//后退
void VideoPlaying::on_pushButton_5_clicked()
{qint64 position = m_player->position(); // 获取当前播放位置position -= 5000; // 向后退5秒(单位为毫秒)if (position < 0) {position = 0; // 不能倒退到负值}m_player->setPosition(position); // 设置视频播放位置}void VideoPlaying::updateSliderPosition()
{qint64 duration = m_player->duration(); // 视频总时长qint64 position=m_player->position();//当前时长if (duration > 0) {int sliderPosition = static_cast<int>(position * 100 / duration);if(!is_slider){ui->horizontalSlider->setValue(sliderPosition); // 更新滑块的位置}ui->label_now->setText(getTime(position)); // 更新当前播放时间}
}QString VideoPlaying::getTime(qint64 time)
{int hours = (time / (1000 * 60 * 60)) % 24;int minutes = (time / (1000 * 60)) % 60;int seconds = (time / 1000) % 60;qDebug() << "视频时长:" << hours << "小时" << minutes << "分钟" << seconds << "秒";QString allTime=QString::number(hours)+":"+QString::number(minutes)+":"+QString::number(seconds);return allTime;
}void VideoPlaying::on_horizontalSlider_sliderPressed()
{is_slider=true;}void VideoPlaying::on_horizontalSlider_sliderMoved(int position)
{if(is_slider) {qint64 duration = m_player->duration(); // 视频总时长,单位为毫秒qint64 newPos = position * duration / 100; // 根据滑块位置计算当前播放位置,单位为毫秒m_player->setPosition(newPos); // 设置视频播放位置ui->label_now->setText(getTime(newPos)); // 更新当前播放时间}}void VideoPlaying::on_horizontalSlider_sliderReleased()
{is_slider=false;}
相关文章:
Qt 实现简易的视频播放器,功能选择视频,播放,暂停,前进,后退,进度条拖拉,视频时长显示
1.效果图 2.代码实现 2.1 .pro文件 QT core gui multimedia multimediawidgets 2.2 .h文件 #ifndef VIDEOPLAYING_H #define VIDEOPLAYING_H#include <QWidget> #include<QFileDialog>#include<QMediaPlayer> #include<QMediaRecorder> #in…...
vue基础教程(6)——构建项目级登录页
同学们可以私信我加入学习群! 正文开始 前言一、创建首页二、登录页代码讲解三、对应的vue知识点:四、附件-各文件代码总结 前言 前面我们已经把vue自带的页面删除,也搭建了最简单的router路由,下面就可以真正开发我们自己的项目…...
C++宝强越狱1.0.6版本
没啥好说的,更新了一关,上代码 #include"bits/stdc.h" #include"Windows.h" #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) using namespace std; int w3,s3,a3,d3; bool nfalse,iptrue,mfals…...
构建高可用性数据库架构:深入探索Oracle Active Data Guard(ADG)
随着企业数据规模的不断增长和业务的复杂化,数据库的高可用性和可靠性变得尤为重要。Oracle Active Data Guard(ADG)作为Oracle数据库提供的一种高可用性解决方案,在实时备份和灾难恢复方面发挥着重要作用。本文将深入探讨ADG的原…...
记录-rosbag的处理
https://blog.csdn.net/qq_39607707/article/details/123716925 https://blog.csdn.net/weixin_51060040/article/details/126612496...
用Wireshark解码H.264
H264,你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容: -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…...
Flink中几个关键问题总结
硬核!八张图搞懂 Flink 端到端精准一次处理语义 Exactly-once(深入原理,建议收藏) Flink可靠性的基石-checkpoint机制详细解析 硬核!一文学完Flink流计算常用算子(Flink算子大全)...
华为配置ARP安全综合功能实验
华为配置ARP安全综合功能实验 组网图形 图1 配置ARP安全功能组网图 ARP安全简介配置注意事项组网需求配置思路操作步骤配置文件 ARP安全简介 ARP(Address Resolution Protocol)安全是针对ARP攻击的一种安全特性,它通过一系列对ARP表项学…...
new mars3d.layer.XyzLayer({的rectangle瓦片数据的矩形区域范围说明
new mars3d.layer.XyzLayer({的rectangle瓦片数据的矩形区域范围说明 2.这个xyz图层的矩形区域范围rectangle从图层文件中无法获取,但是看图层文件可以知道这个是12-21级的数据。 3.一般这个图层数据文件服务会有提供相应的rectangle范围,在服务的xml文…...
数据分析之Tebleau可视化:折线图、饼图、环形图
1.折线图的绘制 方法一: 拖入订单日期和销售金额,自动生成一个折线图 方法二: 选中订单日期和销售金额(摁住ctrl可以选择多个纬度) 点击右边的智能推荐,选择折线图 2.双线图的绘制、双轴的设置 方法一&…...
【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection
🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…...
算法2.6基数排序
基数排序 属于分配式排序,又称桶子法,通过键值的各个位上的值,将要排序的元素分配至某些桶中,达到排序的作用. 基数排序属于稳定性排序,是效率高的稳定性排序法 是桶排序的扩展,将整数按照位数进行切割,再按各个位数进行比较 是用空间换时间的经典算法 在使用8kw个数据进行…...
redis -List
一,List(列表) 1,所应用场景 list实际上是一个链表,before Node after , left, right 都可以插入值如果key不存在,则创建新的链表如果key存在,新增内容如果移除了所有值,空链表,也代表不存在在…...
ARMv8-A架构下的外部debug模型(external debug)简介
Armv8-A external debug Armv8-A debug模型一,外部调试 External debug 简介二,Debug state2.1 Debug state的进入与退出 三,DAP,Debug Access Port3.1 EDSCR, External Debug Status and Control Register调试状态标识࿰…...
DevOps入门
DevOps入门 1. 基础概念和原则 了解DevOps的定义、历史和主要目标 DevOps是一种将软件开发(Dev)与信息技术运维(Ops)结合起来的文化、运动或实践,旨在缩短系统开发生命周期,同时提供高质量的持续交付。DevOps的历史可以追溯到敏捷软件开发的兴起,它强调了开发和运维团队之…...
Docker搭建私有镜像仓库
1.Docker镜像仓库 搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 官网地址:https://hub.docker.com/_/registry 1.1.简化版镜像仓库 Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,…...
流行的API架构学习
几种流行的API架构风格图 SOAP(Simple Object Access Protocol) 优点:SOAP 是一种基于 XML 的通信协议,具有良好的跨平台和跨语言支持。它提供了丰富的安全性和事务管理功能,并支持复杂的消息交换模式。 缺点…...
问题解决:Fatal Python error: initfsencoding: unable to load the file system codec
问题: "D:\...Climb_C_site\venv\Scripts\python.exe" "D:\...\Small_Case\change_suffix.py" Fatal Python error: initfsencoding: unable to load the file system codec ModuleNotFoundError: No module named encodingsCurrent thread 0x…...
WPF —— TreeView树形控件
1 TreeView简介 TreeView 表示一个控件,该控件在树结构(其中的项可以展开和折叠)中显示分层数据。 TreeView 是一个 ItemsControl,这意味着它可以包含任何类型的对象的集合 (,例如字符串、图像或面板) 。 2 Tree Vie…...
2024.2.20力扣每日一题——从前序和中序遍历序列构建二叉树
2024.2.20 题目来源我的题解方法一 递归方法二 迭代 题目来源 力扣每日一题;题序:105 我的题解 方法一 递归 前序特点:[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]中序特点:[ [左子树的中序遍历结果], 根节点…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
