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;

}
相关推荐
一点媛艺3 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风3 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生4 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程4 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk5 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*5 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue5 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man5 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang