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