#include "capvideowidget.h"
#include "ui_capvideowidget.h"
#include <QBitArray>
#include <QIntValidator>
constexpr int INITIAL_VOLUMN = 60;
constexpr int DEFAULE_CUT_SPACE = 10;
constexpr int MAX_SPACE = 1000;
CapVideoWidget::CapVideoWidget(QWidget *parent)
: QWidget(parent)
, whetherPlaying(true)
, ui(new Ui::CapVideoWidget)
{
ui->setupUi(this);
this->setWindowTitle(QString("视频截图工具"));
player = new QMediaPlayer;
player->setVideoOutput(ui->playWidget);
ui->frameSpaceEdit->setValidator(new QIntValidator(0, MAX_SPACE, this));
// 获取视频总时长
QObject::connect(player, &QMediaPlayer::durationChanged, this, &CapVideoWidget::getVideoDuration);
connect(player, &QMediaPlayer::positionChanged, this, &CapVideoWidget::playerPosChange);
}
CapVideoWidget::~CapVideoWidget()
{
delete ui;
}
void CapVideoWidget::on_videoImportBtn_clicked()
{
openVideoName = QFileDialog::getOpenFileName(this, QString("打开目录"), "/");
player->setMedia(QUrl::fromLocalFile(openVideoName));
player->setVolume(INITIAL_VOLUMN);
QByteArray opencvName=openVideoName.toLatin1();
const char *openName=opencvName.data();
capVideoPic.open(openName);
if (!capVideoPic.isOpened()) {
ui->textBrowser->insertPlainText(QString("Opencv读取视频失败") + "\n");
} else {
realFrameNum=(static_cast<long>(capVideoPic.get(cv::CAP_PROP_FRAME_COUNT))); // 获取视频总帧数
capVideoPic.release();
ui->totalFrameLabel->setText(QString::number(realFrameNum));
}
}
void CapVideoWidget::on_playAndSuspendBtn_clicked()
{
if (openVideoName.isEmpty()) {
ui->textBrowser->textCursor().insertText(QString("请检查视频是否已导入!!!") + "\n");
return;
}
if (whetherPlaying) {
player->play();
whetherPlaying = false;
} else {
player->pause();
whetherPlaying = true;
}
}
void CapVideoWidget::on_voiceSlider_valueChanged(int value)
{
player->setVolume(value);
}
void CapVideoWidget::getVideoDuration(qint64 playTime)
{
playTime = player->duration();
videoTime = playTime; // 记录视频总时长
ui->playPosBar->setMaximum(static_cast<int>(playTime));
ui->totalTimeLabel->setText(formatTime(videoTime));
}
void CapVideoWidget::playerPosChange(qint64 posChange)
{
ui->curTimeLabel->setText(formatTime(posChange));
ui->playPosBar->setValue(static_cast<int>(posChange));
ui->totalTimeLabel->setText(formatTime(videoTime - posChange)); // 总时长-已播时长
}
QString CapVideoWidget::formatTime(qint64 mSencond)
{
qint64 hourTime = mSencond / (1000 * 3600);
qint64 minuteTime = (mSencond - hourTime * 1000 * 3600) / (1000 * 60);
qint64 secondTime = (mSencond - hourTime * 1000 * 3600 - minuteTime * 1000 * 60) / 1000;
QString time = QString("%1:%2:%3").arg(hourTime, 2, 10, QLatin1Char('0')).arg(minuteTime, 2, 10, QLatin1Char('0')).arg(secondTime, 2, 10, QLatin1Char('0'));
return time;
}
void CapVideoWidget::on_startCapBtn_clicked()
{
if (openVideoName.isEmpty()) {
ui->textBrowser->textCursor().insertText(QString("请检查视频是否已导入!!!") + "\n");
return;
}
int frameSpace = 0;
ui->frameSpaceEdit->text().isEmpty() ? frameSpace = DEFAULE_CUT_SPACE : frameSpace = spaceNum.toInt();
QByteArray opencvName=openVideoName.toLatin1();
const char *openName=opencvName.data();
capVideoPic.open(openName);
if (capVideoPic.isOpened()) {
QString allPath = saveDirPath;
for (int i = 0; i < realFrameNum; ++i) {
cv::Mat perFrame;
capVideoPic>>perFrame;
if (i % frameSpace == 0) {
QString tempSuffixStr = suffixStr + QString("%1").arg(i, 5, 10, QLatin1Char('0'));
allPath = saveDirPath + tempSuffixStr + ".jpg";
QByteArray finalSaveName = allPath.toLatin1();
const char *cStyleName = finalSaveName.data();
cv::imwrite(cStyleName, perFrame) ? ui->textBrowser->textCursor().insertText(allPath + "\n") :
ui->textBrowser->textCursor().insertText(QString("Opencv保存图片异常!!!") + "\n");
allPath = "";
}
}
ui->textBrowser->textCursor().insertText(QString("保存完成") + "\n");
}
}
void CapVideoWidget::on_savePicBtn_clicked()
{
saveDirPath = QFileDialog::getExistingDirectory(this, QString("imwritePath"), "../");
saveDirPath = saveDirPath + "/";
ui->roadShowLabel->setText(saveDirPath);
}
void CapVideoWidget::on_prefixEdit_textEdited(const QString &prefixStr)
{
suffixStr = prefixStr;
}
void CapVideoWidget::on_stopCapBtn_clicked()
{
capVideoPic.release();
ui->textBrowser->textCursor().insertText(QString("终止截图.") + "\n");
}
void CapVideoWidget::on_frameSpaceEdit_textEdited(const QString &cutSpace)
{
spaceNum = cutSpace;
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt结合OPenCv截图小工具
共13个文件
cpp:2个
qrc:2个
pro:1个
需积分: 50 9 下载量 147 浏览量
2022-10-23
21:36:20
上传
评论
收藏 4.81MB RAR 举报
温馨提示
主要使用Qt中的QMediaPlayer结合OPencv中的VideoCapture类,制作一个视频截图小工具;包含视频的播放、暂停、音量控制、播放进度显示,视频总帧数的显示,指定帧间隔截取保存,显示抽帧保存的进度等;
资源详情
资源评论
资源推荐
收起资源包目录
CapVideoPic.rar (13个子文件)
CapVideoPic
videoCut.ico 4KB
Res.qrc 189B
CapVideoPic.pro.user 19KB
InterfaceStyle.qss 2KB
capvideowidget.cpp 5KB
capvideowidget.h 1KB
RecFile
videoCut.jpg 11KB
voice.png 6KB
RecFile.qrc 8B
main.cpp 441B
capvideowidget.ui 32KB
movie.mp4 5.26MB
CapVideoPic.pro 900B
共 13 条
- 1
笨小孩寻聪
- 粉丝: 7
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0