一 任务描述
1、qt界面中实现视频的播放
2、视频界面分为可操作和不可操作的
不可操作是指,自动播放,只能看不能关闭和停止的,没有操作按钮
可操作是指可以调整音量,调整播放进度条,甚至可以点击全屏播放的功能
二 实现过程
QT += multimedia //使用多媒体模块
QT += multimediawidgets//使用QVideoWidget视频显示组件
视频显示组件有2种:QVideoWidget 和QGraphicsVideoItem, 或者继承这两个类,自定义显示组件
1.MainWindow类基于QMainWindow
2.QmyVideoWidget类基于QVideoWidget
①创建C++类
②写类名QmyVideoWidget / 基类QVideoWidget / 包含QWidget
③对.h 文件修改
a.加上 头文件 #include
b.加上宏 Q_OBJECT
c.修改QmyVideoWidget() 为 QmyVideoWidget(QWidget *parent = Q_NULLPTR)
④ 对.cpp文件修改
QmyVideoWidget::QmyVideoWidget() 改为 QmyVideoWidget::QmyVideoWidget(QWidget *parent) : QVideoWidget(parent)
PS 1:红色禁止的标志 因为没用布局
PS 2:QmyVideoWidget是 添加QWidget组件,右键提升的
PS 3:按钮的图标,直接在ui界面设置
PS 4:布局!!!用好,全屏和退出全屏的时候,没退出,都是布局问题!
①槽函数
a.【自动生成 】按钮点击——clicked()+滑动条滑动值变化——valueChanged()
b.【自定义】文件总时长DurationChanged(qint64 duration)函数 和 当前位置时长函数 void PositionChanged(qint64 position)
设置进度条 和 时长标签
②私有变量:视频播放player指针 + 总时长字符串 + 当前时长字符串
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
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
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
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);
}
①槽函数——【自定义】键盘事件函数 + 设置视频指针函数
②私有变量:视频播放 thePlayer 指针
#ifndef QMYVIDEOWIDGET_H
#define QMYVIDEOWIDGET_H
#include
#include
#include
#include
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
#include "qmyvideowidget.h"
#include
//按键事件,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.为啥 有时候打开不了视频?