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

news2024/12/24 3:31:21

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;

}




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

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

相关文章

数据分析之Tebleau可视化:折线图、饼图、环形图

1.折线图的绘制 方法一&#xff1a; 拖入订单日期和销售金额&#xff0c;自动生成一个折线图 方法二&#xff1a; 选中订单日期和销售金额&#xff08;摁住ctrl可以选择多个纬度&#xff09; 点击右边的智能推荐&#xff0c;选择折线图 2.双线图的绘制、双轴的设置 方法一&…

手机一键换ip地址,解锁网络自由

在数字化时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着移动互联网的快速发展&#xff0c;手机用户对于网络安全和隐私保护的需求也日益增强。其中&#xff0c;IP地址作为手机在网络中的标识&#xff0c;扮演着重要的角色。有时&#xff0c;出于隐私保护或网络…

HTTPS 如何优化?(计算机网络)

硬件优化 因为 HTTPS 是属于计算密集型&#xff0c;应该选择计算力更强的 CPU&#xff0c;而且最好选择支持 AES-NI 特性的 CPU&#xff0c;这个特性可以在硬件级别优化 AES 对称加密算法&#xff0c;加快应用数据的加解密。 软件优化 如果可以&#xff0c;把软件升级成较新的版…

Scala第十五章节(递归的相关概述、Scala阶乘案例、Scala斐波那契数列案例、Scala打印目录文件案例)

章节目标 了解递归的相关概述掌握阶乘案例掌握斐波那契数列案例掌握打印目录文件案例 1. 递归 递归指的就是 方法自己调用自己的情况 . 在涉及到复杂操作时, 我们会经常用到它. 在使用递归时, 要注意以下三点: 递归必须有出口, 否则容易造成 死递归 .递归必须要有规律.构造…

网址打包微信小程序源码 wap转微信小程序 网站转小程序源码 网址转小程序开发

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 我们都知道微信小程序是无法直接打开网址的。 这个小程序源码提供了一种将网址直接打包成微信小程序的方法&#xff0c; 使得用户可以在微信小程序中直接访问这些网址内容。 这个源码没有进行加…

如何评估基于指令微调的视觉语言模型的各项能力-MMBench论文解读

1. 传统基准的固有局限 VQAv2:视觉问题回答数据集,主要用于评估视觉理解与推理能力。COCO Caption:图像描述生成数据集,用于评估模型对图像内容的理解与描述能力。GQA:结合常识的视觉问题回答数据集。OK-VQA:需要外部知识的视觉问题回答数据集。TextVQA:图像中包含文本的…

RAG论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;由Facebook在2020年发表的论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 语言模型存在幻觉 由于知识缺乏&#xff0c;没有实时增量信息没有具体领域的拓展信息…

【MATLAB第103期】#源码分享 | 基于MATLAB的LIME可解释性线性分类预测模型,2020b以上版本

【MATLAB第103期】#源码分享 | 基于MATLAB的LIME可解释性线性分类预测模型&#xff0c;2020b以上版本 一、模型介绍 LIME&#xff08;Local Interpretable Model-agnostic Explanations&#xff09;是一种用于解释复杂机器学习模型预测结果的算法。它由Marco Ribeiro、Sameer…

如何使用极狐GitLab Maven 仓库?

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何使用极狐GitLa…

xss-lab 1-10关过关记录

前言 最近发现xss学的知识点都忘干净了&#xff0c;来打一打靶子并且记录一下这些过关经历。 level1 特性&#xff1a; 1.get型传参 2.无任何过滤 过关操作&#xff1a; 直接构造payload传参过关 level2 get型传参 我们在输入框中输入payload发现并没有弹窗。 查看网页…

Python接口自动化测试-篇1(postman+requests+pytest+allure)

Python接口自动化测试是一种使用Python编程语言来编写脚本以自动执行针对应用程序接口&#xff08;APIs&#xff09;的测试过程。这种测试方法专注于检查系统的不同组件或服务之间的交互&#xff0c;确保它们按照预期规范进行通信&#xff0c;而不涉及用户界面&#xff08;UI&a…

2024年04月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

书生·浦语训练营二期第二次笔记

1. 部署 InternLM2-Chat-1.8B 模型进行智能对话 1.1 配置环境 创建conda环境&#xff0c;安装必要的库 studio-conda -o internlm-base -t demo # 与 studio-conda 等效的配置方案 # conda create -n demo python3.10 -y # conda activate demo # conda install pytorch2.0.…

自定义 Unity Scene 的界面工具

介绍 文档中会进行SceneView的自定义扩展&#xff0c;实现显示常驻GUI和添加自定义叠加层&#xff08;Custom Overlay&#xff09;。 最近项目开发用回了原生的Unity UI相关内容。对于之前常用的FairyGUI来说&#xff0c;原生的UGUI对于UI同学来讲有些不太方便。再加上这次会…

圈子小程序源码-圈子系统成品搭建-APP小程序H5三端源码交付,支持二开!PHP书写,uniAPP后端开发!

【首页】 圈子列表页可分为个人圈子、企业圈子、加入圈子、智诚工业圈子 (平台圈) 四种。 其中重要圈子可选择置顶&#xff0c;方便快速进入:个人圈子和企业圈子数量有限始终位于前位。也可通过搜索快速搜索圈子。 为了实现流量分散入口的集中&#xff0c;将创建企业圈子、发…

服务器设置了端口映射之后外网还是访问不了服务器

目录 排查思路参考&#xff1a; 1、确认服务是否在运行 2、确认端口映射设置是否正确 3、使用防火墙测试到服务器的连通性 4、检查服务内部的配置 5、解决办法 6、学习小分享 我们在一个完整的网络数据存储服务系统设备中都会存有业务服务器、防火墙、交换机、路由器&a…

缓存(反向代理)服务器-varnish

varnish简介&#xff1a; varnish是一款高性能且开源的反向代理服务器和HTTP加速器&#xff0c;&#xff08;其实就是带缓存的反向代理服务器&#xff09;它可以把整个HTTP响应内容缓存到内存或文件中&#xff0c;从而提高web服务器器的响应速度。 与传统的squid相比&#xff0…

electron 打不同环境的包

我用的打包工具: electron-builder 1、在package.json 文件的同级下创建2个js文件 electron-builder-test.config.js electron-builder.config.js electron-builder-test.config.js const basejson require(./electron-builder.config.js); module.exports {extraMetada…

【opencv】教程代码 —features2D(6)透视矫正:读取两个棋盘格图片并进行图像对齐...

perspective_correction.cpp 透视校正 hconcat(img2, img1_warp, img_draw_warp); hconcat(img1, img2, img_draw_matches); #include <iostream> // 引入iostream库&#xff0c;用于进行标准输入和输出操作 #include <opencv2/core.hpp> // 引入opencv的core库&am…

session学习

3次请求均有sessionID session的作用 跟踪用户的行为&#xff0c;方便日后推荐客户端和服务器交互相对安全些session是代表会话&#xff0c;也可理解为客户端和服务端的交互sessionID是服务器生成的唯一字符串&#xff0c;用来跟踪用户行为cookie是浏览器自带的&#xff0c;专…