ICode9

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

Qt 视频播放器

2021-09-22 16:03:36  阅读:136  来源: 互联网

标签:播放器 视频 Widget Qt player ui QString 播放


1. 界面布局:

 2. 调用 API 播放视频

加载视频播放模板

 在 widget.h 中

 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

程序运行结果:

 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. 程序运行结果:

 

标签:播放器,视频,Widget,Qt,player,ui,QString,播放
来源: https://blog.csdn.net/m0_60178310/article/details/120413243

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

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

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

ICode9版权所有