Qt做的视频播放器

1 篇文章 0 订阅
1 篇文章 0 订阅

今天用Qt做了一个简单的视频播放器,有播放、暂停、全屏、查看播放进度、设置播放进度的功能。
应该需要下载LAV Filters视频解码器才能播放视频。

主源代码如下:
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QFileDialog>
#include <QDebug>
#include <QMouseEvent>
#include <QTimer>
#include <QTimerEvent>
#include <QSlider>
#include <QDockWidget>
#include <QLabel>

#define TIMEOUT_MSECS 3000
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    void timerTimeOut();
    void init(QString);
    void setDuration(qint32);
    void setSliderValue(qint32);
    ~MainWindow();
protected:
    void mouseMoveEvent(QMouseEvent *);

private slots:
    void on_action_play_triggered();

    void on_action_pause_triggered();

    void on_action_max_triggered();

    void on_action_min_triggered();

    void handleError();

private:
    Ui::MainWindow *ui;
    QMediaPlayer *player;
    QVideoWidget *videoWidget;
    QTimer *timer;
    QString fileName;
    QSlider *slider;
    QDockWidget *dock;
    QLabel *label;
    int dh,dm,ds;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->toolBar->setFloatable(false);
    ui->toolBar->setMovable(false);
    addToolBar(Qt::BottomToolBarArea,ui->toolBar);

    videoWidget=new QVideoWidget(this);
    setCentralWidget(videoWidget);
    videoWidget->setMouseTracking(true);
    videoWidget->setAspectRatioMode(Qt::KeepAspectRatio);

    player=new QMediaPlayer(this);
    player->setVideoOutput(videoWidget);

    setMouseTracking(true);

    label=new QLabel(ui->toolBar);
    label->setText("00:00:00\n00:00:00");
    label->setFont(QFont("Consolas"));
    ui->toolBar->addWidget(label);

    slider=new QSlider(ui->toolBar);
    slider->setOrientation(Qt::Horizontal);
    slider->setSingleStep(1);
    ui->toolBar->addWidget(slider);

    connect(player,&QMediaPlayer::durationChanged,this,&MainWindow::setDuration);
    connect(player,&QMediaPlayer::positionChanged,this,&MainWindow::setSliderValue);
    connect(slider,&QSlider::sliderMoved,player,&QMediaPlayer::setPosition);
    connect(player,SIGNAL(error(QMediaPlayer::Error)),this,SLOT(handleError()));

    timer=new QTimer(this);
    connect(timer,&QTimer::timeout,this,&MainWindow::timerTimeOut);
    timer->start(TIMEOUT_MSECS);
}
void MainWindow::handleError()
{
    QMessageBox::critical(nullptr,"解析文件错误","无法解析视频文件");
}
void MainWindow::setSliderValue(qint32 value)
{
    slider->setValue(value);
    int h,m,s;
    value /= 1000;
    h = value/3600;
    m = (value-h*3600)/60;
    s = value-h*3600-m*60;
    label->setText(QString("%1:%2:%3\n%4:%5:%6")
                   .arg(h,2,10,QChar('0'))
                   .arg(m,2,10,QChar('0'))
                   .arg(s,2,10,QChar('0'))
                   .arg(dh,2,10,QChar('0'))
                   .arg(dm,2,10,QChar('0'))
                   .arg(ds,2,10,QChar('0'))
                   );
}
void MainWindow::setDuration(qint32 duration)
{
    slider->setRange(0,duration);
    duration/=1000;
    dh=duration/3600;
    dm=(duration-dh*3600)/60;
    ds=duration-dh*3600-dm*60;
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_action_play_triggered()
{
    if(player->state()==QMediaPlayer::PausedState||player->state()==QMediaPlayer::StoppedState)
    {
        if(fileName.isEmpty())
        {
            fileName=QFileDialog::getOpenFileName(nullptr,"选择播放文件",QString(),"视频(*.mp4 *.mov *.avi *.wmv)\n所有文件(*.*)");
            if(fileName.isEmpty())return;
            player->setMedia(QUrl::fromLocalFile(fileName));
        }
        player->play();
    }
}
void MainWindow::init(QString name)
{
    fileName=name;
    player->setMedia(QUrl::fromLocalFile(name));
}

void MainWindow::on_action_pause_triggered()
{
    player->pause();
}

void MainWindow::on_action_max_triggered()
{
    this->showFullScreen();
}

void MainWindow::on_action_min_triggered()
{
    this->showNormal();
}
void MainWindow::mouseMoveEvent(QMouseEvent *)
{
    ui->toolBar->setHidden(false);
    if(timer->isActive())timer->stop();
    timer->start(TIMEOUT_MSECS);
}
void MainWindow::timerTimeOut()
{
    ui->toolBar->setHidden(true);
    if(timer->isActive())timer->stop();
}


运行效果:
运行效果

有需要图标、项目文件、UI文件等其他文件的,在这里下载:
https://download.csdn.net/download/alan_zhao_2007/11527911

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值