ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Qt做的视频播放器

2019-08-12 17:07:25  阅读:205  来源: 互联网

标签:播放器 视频 Qt void timer player ui include MainWindow


今天用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

标签:播放器,视频,Qt,void,timer,player,ui,include,MainWindow
来源: https://blog.csdn.net/Alan_Zhao_2007/article/details/99312076

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有