Qt 视频播放器

1. 界面布局:

Qt 视频播放器

 2. 调用 API 播放视频

加载视频播放模板

Qt 视频播放器

 在 widget.h 中

Qt 视频播放器

 widget.cpp 中

// 在构造函数处编写代码
    // 实例化播放视频对象
    this->player = new QMediaPlayer(this);
    // 实例化播放视频框框
    this->videoWidget = new QVideoWidget(this);
    // 设置播放视频框框的大小
    this->videoWidget->resize(800, 600);
    // 将要播放的视频输出到播放视频框框中去
    this->player->setVideoOutput(this->videoWidget);
    // 设置要播放的视频路径
    player->setMedia(QUrl::fromLocalFile("F:/C C++/Resource/Video/03.mp4"));
    // 设置声音
    player->setVolume(30);
    // 播放视频
    player->play();

3. 解决视频无法播放错误

下载并安装  LAVFilters: https://github.com/Nevcairiel/LAVFilters/releases

程序运行结果:

Qt 视频播放器

 4. 将文件设置到控件 QListView 控件中去

// 打开文件对话框
    QString fileName = QFileDialog::getOpenFileName(this, "打开文件", "F:/C C++/Resource/Video");
    // 将获取到的文件名显示到 QListView 控件中去,
    // QStandardItem是存储数据的单元格,它存储的是QString
    QStandardItem * item = new QStandardItem(fileName);
    // QStandardItemModel q标准化模型类提供了一个用于存储定制数据的通用模型
    QStandardItemModel * model = new QStandardItemModel(this);
    // QStandardItemModel::appendRow 追加包含项的行。如有必要,列计数将增加到项目的大小。
    model->appendRow(item);
    // 将获取的文件加载进控件 QListView 中去
    ui->listView->setModel(model);

5. 完整代码:

widget.h 文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QStandardItem>
class QMediaPlayer;         // 播放视频类
class QVideoWidget;         // 播放视频的框框
class QStandardIterModel;   // 复制模块
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    QStandardItemModel * model1 = new QStandardItemModel(this);
    // 视频更新位置 (分 秒)
    void updataPosition(qint64 posistion);
    // 将 秒数 转换成 时分秒 类型
    QString ChangeTime(qint64 position);

private slots:
    void on_btnPlay_clicked();
    void on_btnPause_clicked();
    void on_btnStop_clicked();
    void on_btnFile_clicked();
    void on_btnDir_clicked();
    void on_listView_doubleClicked(const QModelIndex &index);
    void on_horizontalSliderVolume_sliderMoved(int position);
 
private:
    QMediaPlayer * player;  // 播放视频对象
    QVideoWidget * videoWidget; // 播放视频框框对象
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp 文件:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QFileDialog>

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

    // 实例化播放视频对象
    this->player = new QMediaPlayer(this);
    // 实例化播放视频框框
    this->videoWidget = new QVideoWidget(this);
    // 设置播放视频框框的大小
    this->videoWidget->resize(800, 600);
    // 将要播放的视频输出到播放视频框框中去
    this->player->setVideoOutput(this->videoWidget);
    // 设置要播放的视频路径
    //player->setMedia(QUrl::fromLocalFile("F:/C C++/Resource/Video/03.mp4"));
    // 设置声音 起始音量为0
    player->setVolume(0);
    // 播放视频
    //player->play();
    // 关联滑块和播放视频的进程
    connect(player, &QMediaPlayer::positionChanged, this, &Widget::updataPosition);
    //connect(ui->horizontalSliderTime, &QSlider::sliderMoved, this->player, &QMediaPlayer::positionChanged);
}

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

// 播放视频
void Widget::on_btnPlay_clicked()
{
    this->player->play();   // 播放视频
    ui->label_bofangzhuangtai->setText("视频播放中...");
}
// 暂停视频
void Widget::on_btnPause_clicked()
{
    this->player->pause();  // 暂停视频
    ui->label_bofangzhuangtai->setText("视频暂停中");
}
// 停止播放视频
void Widget::on_btnStop_clicked()
{
    this->player->stop();   // 停止视频播放
    ui->label_bofangzhuangtai->setText("");
}
// 打开文件
void Widget::on_btnFile_clicked()
{
    // 打开文件对话框
    QString fileName = QFileDialog::getOpenFileName(this, "打开文件", "F:/C C++/Resource/Video");
    // 将获取到的文件名显示到 QListView 控件中去,
    // QStandardItem是存储数据的单元格,它存储的是QString
    QStandardItem * item = new QStandardItem(fileName);
    // QStandardItemModel q标准化模型类提供了一个用于存储定制数据的通用模型
    QStandardItemModel * model = new QStandardItemModel(this);
    // QStandardItemModel::appendRow 追加包含项的行。如有必要,列计数将增加到项目的大小。
    model->appendRow(item);
    // 将获取的文件加载进控件 QListView 中去
    ui->listView->setModel(model);
    // 设置当前媒体源。如果提供了流;将从中读取媒体数据,而不是解析媒体源
    this->player->setMedia(QUrl::fromLocalFile(fileName));
    // 播放视频
    this->player->play();
    ui->label_bofangzhuangtai->setText("视频播放中...");    // 设置标签播放状态
}
// 打开目录
void Widget::on_btnDir_clicked()
{
    // 弹出文件对话框 获取目录
    QString filePath = QFileDialog::getExistingDirectory();
    // 设置要遍历的目录
    QDir dir(filePath);
    // 设置文件过滤器 (列表) 装入过滤的文件格式
    QStringList nameFileters;
    // 设置文件过滤格式 设置只要的格式
    nameFileters << "*mp4" << "*mkv";
    // 将过滤的文件名称装入到链表中去
    QStringList files = dir.entryList(nameFileters, QDir::Files | QDir::Readable, QDir::Name);
    // 将获取的文件目录所有文件显示到控件 QListView 中去
    for(int i = 0; i < files.count(); i++)
    {
        // QStandardItem是存储数据的单元格
        QStandardItem * Item = new QStandardItem(filePath + '/' + files.at(i));
        // QStandardItemModel q标准化模型类提供了一个用于存储定制数据的通用模型
//        QStandardItemModel * model1 = new QStandardItemModel(this); // 放到了头文件中去
        // 追加包含项的行
        model1->appendRow(Item);
        // 将所有的文件显示到控件 QListView 中去
        ui->listView->setModel(model1);
    }
}
// 双击控件 QListView 中的行,播放视频
void Widget::on_listView_doubleClicked(const QModelIndex &index)
{
    // 获取 QListView 控件中的内容 通过index 区别是哪一行
    QString file = ui->listView->model()->data(index).toString();
    // 设置要播放的文件 设置当前媒体源
    this->player->setMedia(QUrl::fromLocalFile(file));
    // 播放视频
    this->player->play();
    ui->label_bofangzhuangtai->setText("视频播放中...");    // 设置标签播放状态
}
// 移动控件 通过控件设置音量
void Widget::on_horizontalSliderVolume_sliderMoved(int position)
{
    this->player->setVolume(position);  // 设置音量
    // 将移动的位置 在便签控件中显示数字
    ui->label_Volume->setText(QString("%1").arg(position));
}
// 视频更新位置 (分 秒)
void Widget::updataPosition(qint64 posistion)
{
    // 更新滑块 并显示更新时间
    ui->horizontalSliderTime->setMaximum(player->duration()/1000);
    ui->horizontalSliderTime->setValue(posistion/1000);
    // 将时长设置给便签控件
    ui->label_time01->setText(ChangeTime(posistion/1000));
    ui->label_time02->setText(ChangeTime(player->duration()/1000));
}
// 将 秒数 转换成 时分秒 类型
QString Widget::ChangeTime(qint64 position)
{
    // 获取时分秒
    int hour = 0;
    int min = position/60;
    int second = position%60;
    // 判断是否达到60分钟以上 改小时
    if(min >= 60)
    {
        hour = min/60;
        min = min%60;
    }
    // 格式化 时间格式
    QString str_hour = (hour>9)?QString::number(hour):tr("0")+QString::number(hour);
    QString str_min = (min>9)?QString::number(min):tr("0")+QString::number(min);
    QString str_second = (second>9)?QString::number(second):tr("0")+QString::number(second);
    return (str_hour + ":" + str_min + ":" + str_second);
}

6. 程序运行结果:

Qt 视频播放器

 

上一篇:QTModbusRTU通信之QSerialPortInfo::availablePorts()


下一篇:QT重启程序