QT任务016:视频播放———在QVideoWidget上基于QMediaPlayer

一 任务描述

1、qt界面中实现视频的播放
2、视频界面分为可操作和不可操作的
不可操作是指,自动播放,只能看不能关闭和停止的,没有操作按钮
可操作是指可以调整音量,调整播放进度条,甚至可以点击全屏播放的功能

二 实现过程

1. 配置工程

QT	+= multimedia      //使用多媒体模块
QT += multimediawidgets//使用QVideoWidget视频显示组件

视频显示组件有2种:QVideoWidget 和QGraphicsVideoItem, 或者继承这两个类,自定义显示组件

2.创建2个类MainWindow 和 QmyVideoWidget,以及对应的.cpp文件

1.MainWindow类基于QMainWindow

2.QmyVideoWidget类基于QVideoWidget

①创建C++类

②写类名QmyVideoWidget / 基类QVideoWidget / 包含QWidget

③对.h 文件修改

    a.加上 头文件 #include <QVideoWidget>

    b.加上宏 Q_OBJECT

扫描二维码关注公众号,回复: 11109975 查看本文章

    c.修改QmyVideoWidget() 为 QmyVideoWidget(QWidget *parent = Q_NULLPTR)

④ 对.cpp文件修改

QmyVideoWidget::QmyVideoWidget() 改为 QmyVideoWidget::QmyVideoWidget(QWidget *parent) : QVideoWidget(parent)

3.绘制UI界面

PS 1:红色禁止的标志  因为没用布局

PS 2:QmyVideoWidget是   添加QWidget组件,右键提升的

PS 3:按钮的图标,直接在ui界面设置

PS 4:布局!!!用好,全屏和退出全屏的时候,没退出,都是布局问题!

4.写主窗口 .h 文件

①槽函数

a.【自动生成 】按钮点击——clicked()+滑动条滑动值变化——valueChanged()

b.【自定义】文件总时长DurationChanged(qint64 duration)函数  和 当前位置时长函数 void PositionChanged(qint64 position)

设置进度条 和 时长标签

②私有变量:视频播放player指针 + 总时长字符串 + 当前时长字符串

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include<QMediaPlayer>
#include<qmyvideowidget.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:

    void on_pushBtn_open_clicked();

    void on_pushBtn_voise_clicked();

    void on_pushButton_3_clicked();


    void on_horizontalSlider_valueChanged(int value);

    void on_horizontalSlider_2_valueChanged(int value);

    //自定义槽函数
    void Init();//初始化

    void DurationChanged(qint64 duration);//文件播放总时长 连接 总时长函数
    void PositionChanged(qint64 position);//文件当前播放位置时长 连接 位置函数

private:
    Ui::MainWindow *ui;\
    QMediaPlayer   *player;//视频播放器

    QString  durationTime;//总时长
    QString  positionTime;//当前位置时长
};

#endif // MAINWINDOW_H

5.写mainwindow .cpp文件

PS 1: 初始化的4个方面

PS 2:注意获取当前文件名 QFileInfo fileInfo(aFile);  ui->label->setText(fileInfo.fileName());

QFileInfo 的参考用法:

https://www.jianshu.com/p/5b851186f4b6

https://blog.csdn.net/huyisu/article/details/27550933

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include    <QFileDialog>

void MainWindow::Init()
{
    player = new QMediaPlayer(this);        //①实例化 视频播放器
    player->setNotifyInterval(1000);        //②信息更新周期???? 1秒更新一次
    player->setVideoOutput(ui->Videowidget);//③设置视频 的 显示组件
    ui->Videowidget->setMediaPlayer(player);//④设置显示组件 的 关联播放器

}


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Init();

    connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(DurationChanged(qint64)));
    connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(PositionChanged(qint64)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 文件总播放时长 连接 总时长函数
void MainWindow::DurationChanged(qint64 duration)
{
    //positionChanged(qint64)信号 带了总时长参数  单位ms
    ui->horizontalSlider_2->setMaximum(duration);//最大数

    int secs = duration /1000;//换成 总秒
    int mins = secs / 60;//换成分钟的数值
    secs = secs %60;//换成剩余秒的数值

    durationTime = QString::asprintf("%d:%d",mins,secs);
    ui->label_2->setText(positionTime+"/"+durationTime);
}
//文件当前播放位置变化 的时长 连接 位置进度函数
void MainWindow::PositionChanged(qint64 position)
{
    if(ui->horizontalSlider_2->isSliderDown()) //如果正在拖动进度条,退出
        return;
    ui->horizontalSlider_2->setSliderPosition(position);//设置进度条位置

    int secs = position /1000;//秒
    int mins = secs / 60;//分钟
    secs = secs %60;//剩余秒
    positionTime = QString::asprintf("%d:%d",mins,secs);
    ui->label_2->setText(positionTime+"/"+durationTime);
}

//打开视频文件 找到所在位置
void MainWindow::on_pushBtn_open_clicked()
{
    QString curPath = QDir::homePath();//获取系统当前目录
    QString dlgTitle = "选择视频文件";//对话框标题
    QString filter = "mp4文件(*.mp4);;wmv文件(*.wmv);;所有文件(*.*)";
    QString aFile = QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);

    if(aFile.isEmpty())
        return;

    //获取文件名称,并更新
    QFileInfo fileInfo(aFile);
    ui->label->setText(fileInfo.fileName());

    //开始播放
    player->setMedia(QUrl::fromLocalFile(aFile));//设置好文件
    player->play();//开始播放
}

//音量滑动条 调节按钮
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
    player->setVolume(value);
}

//静音按钮
void MainWindow::on_pushBtn_voise_clicked()
{
    bool mute = player->isMuted();//判断静音 isMuted() 是否静音的函数
    player->setMuted(!mute);//设置静音注意 中文感叹号
    if(mute)
         ui->pushBtn_voise->setIcon(QIcon(":/new/prefix1/pic/volumn.bmp"));//更新图标
    else
        ui->pushBtn_voise->setIcon(QIcon(":/new/prefix1/pic/mute.bmp"));
}

//全屏按键
void MainWindow::on_pushButton_3_clicked()
{
    ui->Videowidget->setFullScreen(true);
}

//播放位置 进度条更新进度
void MainWindow::on_horizontalSlider_2_valueChanged(int value)
{
    player->setPosition(value);
}

6.写myVideoWidget .h 文件

①槽函数——【自定义】键盘事件函数 + 设置视频指针函数

②私有变量:视频播放 thePlayer 指针 

#ifndef QMYVIDEOWIDGET_H
#define QMYVIDEOWIDGET_H

#include <QObject>
#include <QWidget>
#include <QVideoWidget>
#include <QMediaPlayer>

class QmyVideoWidget : public QVideoWidget
{
    //Q_OBJECT;加入了Q_OBJECT,才能使用QT中的signal和slot机制,这个不用
public:
    //explicit QmyVideoWidget(QWidget *parent = nullptr);

    QmyVideoWidget(QWidget *parent = Q_NULLPTR);
    void setMediaPlayer(QMediaPlayer *player);
    
protected:
    void keyPressEvent(QKeyEvent *event);
private:
    QMediaPlayer *thePlayer;
};

#endif // QMYVIDEOWIDGET_H

 7.写myVideoWidget .cpp文件

#include "qmyvideowidget.h"

#include    <QKeyEvent>
//按键事件,ESC退出全屏状态
void QmyVideoWidget::keyPressEvent(QKeyEvent *event)
{
    if ((event->key() == Qt::Key_Escape)&&(isFullScreen()))
    {
        setFullScreen(false);
        event->accept();
        QVideoWidget::keyPressEvent(event);
    }
}

QmyVideoWidget::QmyVideoWidget(QWidget *parent): QVideoWidget(parent)
{

}

//设置播放器
void QmyVideoWidget::setMediaPlayer(QMediaPlayer *player)
{
    thePlayer=player;
}

【Q】

1.为什么 视频抖动?

2.为啥 有时候打开不了视频?

发布了127 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37631516/article/details/105128869