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_OBJECT

public:
    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;

}




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言进阶】- 内存函数

内存函数 1.1 内存函数的使用1.2 memcpy函数的使用1.3 memcpy函数的模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现2.3 memcmp函数的使用2.4 memset函数的使用 1.1 内存函数的使用 内存函数就是对内存中的数据进行操作的函数 1.2 memcpy函数的使用 void* memcpy ( …

Tomcat调优总结(Tomcat自身优化、Linux内核优化、JVM优化)

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例&#xff0c;讲解参数。 同时也得认识到一点&#xff0c;tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此我们可…

每天五分钟深度学习:神经网络和深度学习有什么样的关系?

本文重点 神经网络是一种模拟人脑神经元连接方式的计算模型&#xff0c;通过大量神经元之间的连接和权重调整&#xff0c;实现对输入数据的处理和分析。而深度学习则是神经网络的一种特殊形式&#xff0c;它通过构建深层次的神经网络结构&#xff0c;实现对复杂数据的深度学习…

用Python实现办公自动化(自动化处理PDF文件)

自动化处理 PDF 文件 目录 自动化处理 PDF 文件 谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装 &#xff08;一&#xff09;批量下载 PDF 文件 1.使用Selenium模块爬取多页内容 2.使用Selenium模块下载PDF文件 3.使用urllib模块来进行网页的下载和保存 4.使用urllib…

AI预测福彩3D第23弹【2024年4月1日预测--第5套算法开始计算第5次测试】

今天&#xff0c;咱们继续进行本套算法的测试&#xff0c;本套算法目前也已命中多次。今天为第五次测试&#xff0c;仍旧是采用冷温热趋势结合AI模型进行预测。好了&#xff0c;废话不多说了。直接上结果~ 仍旧是分为两个方案&#xff0c;1大1小。 经过人工神经网络计算并进行权…

基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 Vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Design Name: // …

MarkDown之时序图并行、条件、循环、可选高级语法(三十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Jenkins首次安装选择推荐插件时出现”No such plugin cloudbees-folder”解决方案

安装Jenkins成功之后&#xff0c;首次启动Jenkins后台管理&#xff0c;进入到安装插件的步骤&#xff0c;选择"推荐安装"&#xff0c;继续下一步的时候出现错误提示&#xff1a; 出现一个错误 安装过程中出现一个错误&#xff1a;No such plugin&#xff1a;cloudb…

Shell与Bash与POSIX与Linux间的关系

shell是什么&#xff1f; Shell的英语翻译是“壳”&#xff0c;其作用也跟名字差不多&#xff0c;为操作系统套个壳&#xff0c;人与操作系统的壳交互。与壳相对应的则是操作系统内核&#xff0c;一个“壳”一个“核”。核从1970年代开始就基本定型了&#xff0c;没什么大的改…

卷积神经网络-池化层

卷积神经网络-池化层 池化层&#xff08;Pooling Layer&#xff09;是深度学习神经网络中的一个重要组成部分&#xff0c;通常用于减少特征图的空间尺寸&#xff0c;从而降低模型复杂度和计算量&#xff0c;同时还能增强模型的不变性和鲁棒性。 池化操作通常在卷积神经网络&am…

网络基础——ISIS

名词 ISIS&#xff1a;中间系统到中间系统&#xff0c;优先级是15集成化ISIS&#xff1a;这是在优化后&#xff0c;可以使用在OSI模型上的NET地址&#xff1a;由区域ID、系统ID和SEL组成&#xff0c;一台设备上最多配置3个NET地址&#xff0c;条件是区域号要不一致&#xff0c;…

海康Ehome2.0与5.0设备接入EasyCVR视频汇聚平台时的配置区别

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

git log

让日期数字化 &#xff08;这几个英文的月份简写实在看着断片&#xff09; git log --dateformat:"%Y%m%d"一行显示 数字日期 作者 commit git log --dateformat:"%Y%m%d" --prettyformat:"%ad %an %s"反向&#xff0c;最早的放前面。 --rev…

LeetCode刷题:无重复字符的最长子串 详解 【3/1000 第三题】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

LeNet卷积神经网络

文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下&#xff1a; self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数&#xff0c;out_cha…

前端常用代码整理— js,jquery篇(3)

目录 1.判断是否是json字符串 2.获取当前网址 3.将文本复制到剪贴板 4.获取一个月的天数 5.展平数组 6.要修改getRandomItem函数以返回数组中的随机两个元素&#xff0c;可以尝试以下代码 1.判断是否是json字符串 const isJson str > {try {JSON.parse(str);return …

【JavaWeb】Day30.SpringBootWeb请求响应——响应

响应 HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有请求就有响应&#xff09;那么Controller程序&#xff0c;除了接收请求外&#xff0c;还可以进行响应。 1.ResponseBody 在我们前面所编写的controller方法中&#xff0c;都已经设置了响应数据。 controller方…

基于ArgoCD和Testkube打造GitOps驱动的Kubernetes测试环境

本文介绍了一项新工具&#xff0c;可以基于Gitops手动或者自动实现Kubernetes集群应用测试&#xff0c;确保集群的健康状态与Git仓库定义的一致。原文: GitOps-Powered Kubernetes Testing Machine: ArgoCD Testkube 简介&#xff1a;GitOps 云原生测试面临的挑战 现代云原生应…

Unity中UI系统1——GUI

介绍 工作原理和主要作用 基本控件 a.文本和按钮控件 练习&#xff1a; b.多选框和单选框 练习&#xff1a; 用的是第三种方法 c.输入框和拖动框 练习&#xff1a; 练习二&#xff1a; e.图片绘制和框 练习&#xff1a; 复合控件 a.工具栏和选择网格 练习&#xff1a; b.滚动视…

【stm32】USART编码部分--详细步骤

USART编码部分(文章最后附上源码) 如果看不懂步骤可以根据源码参考此篇文章就能轻而易举学会USART通信啦&#xff01; 编码步骤 第一步 开启时钟 把需要用到的USART和GPIO的时钟打开 第二部 GPIO初始化 把TX配置成复用输出&#xff0c;RX配置成输入(上拉输入、浮空输入)。…