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

1.效果图

2.代码实现

2.1 .pro文件

cpp 复制代码
QT       += core gui multimedia multimediawidgets

2.2 .h文件

cpp 复制代码
#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文件

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;

}
相关推荐
mqiqe20 分钟前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin22 分钟前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
Ysjt | 深1 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__1 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞1 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货1 小时前
Rust 的简介
开发语言·后端·rust
湫ccc1 小时前
《Python基础》之基本数据类型
开发语言·python
Matlab精灵1 小时前
Matlab函数中的隐马尔可夫模型
开发语言·matlab·统计学习