RecordScreen.h 该类主要通过定时器实现屏幕截图
#ifndef RECORD_SCREEN_H
#define RECORD_SCREEN_H
#include <QtGui>
#include <QTime>
#include <QWidget>
class RecordScreen :public QObject {
Q_OBJECT
public:
RecordScreen();
~RecordScreen();
void screenStart();
void screenEnd();
public slots:
void shotScreen();
private:
int count;
QTimer* time;
};
#endif // !RECORD_SCREEN_H
RecordScreen.cpp
#include "recordscreen.h"
#include <QObject>
#include <QDesktopWidget>
#include <QtWidgets/QApplication>
RecordScreen::RecordScreen()
{
count = 0;
}
RecordScreen::~RecordScreen()
{
screenEnd();
delete time;
}
/**
* 开始录屏
*/
void RecordScreen::screenStart()
{
QString path = QDir::currentPath();//当前工作路径
path += "/image/photoscreen";
int index= path.lastIndexOf("/");
QString levelabovPath = path.left(index);
QDir dir(levelabovPath);
if (!dir.exists()) {
bool ok = dir.mkdir(levelabovPath);//只创建一级子目录,即必须保证上级目录存在
//return ;
}
dir.setPath(path);
if (!dir.exists()) {
bool ok = dir.mkdir(path);//只创建一级子目录,即必须保证上级目录存在
//return ;
}
QStringList filter; //过滤器
filter.append("*");
QDirIterator it(path, filter, QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext()) { //若容器中还有成员,继续执行删除操作
dir.remove(it.next());
}
time = new QTimer();
//time->setInterval(1);
connect(time, SIGNAL(timeout()), this, SLOT(shotScreen()));
time->start(10);
}
void RecordScreen::screenEnd()
{
time->stop();
}
/**
* 录屏保存为图片
*/
void RecordScreen::shotScreen()
{
QScreen* screen = QGuiApplication::primaryScreen();
QString path = QDir::currentPath();//当前工作路径
path += "/image/photoscreen/";
count++;
QString fileName = QString::number(count);
QString format = ".png";
fileName = path + fileName+ format;
bool ok = screen->grabWindow(0).save(fileName);
if (ok)
{
//日志记录
//qDebug() << "save photo success";
}
else
{
//qCritical() << "save photo unsuccess";
}
}
Screenthread.h 多线程
#pragma once
#include <QThread>
#include "recordscreen.h"
class ScreenThread :public QThread {
public:
void ScreenThread::run()
{
RecordScreen* record = new RecordScreen;
record->screenStart();
exec();
}
ScreenThread::~ScreenThread()
{
if (record)
{
delete record;
record = NULL;
}
}
private:
RecordScreen* record =NULL;
};
RecordManager.h 管理类
#ifndef RECORD_MANAGER_H
#define RECORD_MANAGER_H
#include <QWidget>
#include <QtGui>
#include "base/common.h"
#include "Screenthread.h"
#include <QProcess>
class RecordManager :public QObject
{
Q_OBJECT
public:
void recordScreen();
void endRecordScreen();
void playback();
~RecordManager();
private:
RecordManager() {};
private:
SetGetMacro(PTR<ScreenThread>, record);
QProcess m_process;
public:
static RecordManager& GetInstance()
{
static RecordManager instance;
return instance;
}
};
#endif // !RECORD_MANAGER_H
RecordManager.cpp
#include "RecordManager.h"
#include <QDesktopWidget>
#include <QApplication>
#include <QMediaPlayer>
#include <QVideoWidget>
RecordManager::~RecordManager()
{
/*endRecordScreen();*/
}
void RecordManager::recordScreen()
{
//if (!m_record)
//{
// m_record = PTR_NEW(ScreenThread);
//}
//m_record->start();
m_process.setProcessChannelMode(QProcess::MergedChannels);
QString cmd = "D:/ffmpeg-master-latest-win64-gpl-shared/bin/ffmpeg -f gdigrab -i desktop -framerate 60 -offset_x 0 -offset_y 0 -video_size 1600x900 -pix_fmt yuv420p -vcodec libx264 -crf 18 D:/out1.mp4";
m_process.start(cmd);
}
void RecordManager::endRecordScreen()
{
if (m_process.isOpen())
{
m_process.write("q");
}
//if (m_record)
//{
// m_record->quit();
//}
//QDesktopWidget* desktop = QApplication::desktop();
//int width = desktop->width();
//int height = desktop->height();
//QString path = QDir::currentPath();//当前工作路径
//QString videopath = path + "/image/screenVideo/";
//QDir dir(videopath);
//cv::String cou = std::to_string(dir.count() - 1);
//cv::String videoNamePath = "image/screenVideo/Videotest" + cou + ".avi";
//cv::VideoWriter video(videoNamePath, CV_FOURCC('M', 'J', 'P', 'G'), 5.0/*27.0*/, cv::Size(width, height));
//cv::String img_path = path.toStdString() + "/image/photoscreen/";
//vector<cv::String> img;
//if (!dir.exists()) {
// bool ok = dir.mkdir(videopath);//只创建一级子目录,即必须保证上级目录存在
// return ;
//}
//dir.setFilter(QDir::Files);
//QString photopath = path + "/image/photoscreen/";
//QDir* pdir = new QDir(photopath);
//QStringList filter2;
//filter2 << "*.png";
//pdir->setNameFilters(filter2); //过滤文件类型
//QList<QFileInfo>* fileInfo = new QList<QFileInfo>(pdir->entryInfoList(filter2));
//int count = fileInfo->count(); //文件个数
//glob(img_path, img, false);
//count = img.size();
// //count = 80;
//for (size_t i = 0; i < count; i++)
//{
// stringstream str;
// str << i << ".png";
// String tem = photopath.toStdString() + str.str();
// cv::Mat image = cv::imread(tem);
// if (!image.empty())
// {
// cv::resize(image, image, cv::Size(width, height));
// video << image;
// //日志记录
// //qDebug()<< "正在处理第" << i << "帧" ;
// }
//}
//video.release();
}
void RecordManager::playback()
{
QDesktopWidget* desktop = QApplication::desktop();
QString path = QDir::currentPath();//当前工作路径
QString videopath = path + "/image/screenVideo/";
QDir dir(videopath);
QString cou = QString::number(dir.count() - 2);
QString videoNamePath = videopath + "Videotest" + cou + ".avi";
QMediaPlayer* mediaPlayer = new QMediaPlayer;
QRect desktopRect = QApplication::desktop()->availableGeometry();
mediaPlayer->setMedia(QUrl(videoNamePath));
QVideoWidget* videoWidget = new QVideoWidget;
mediaPlayer->setVideoOutput(videoWidget);
videoWidget->resize(desktop->width() - 10, desktop->height() - 80);
videoWidget->move((desktop->width() - videoWidget->width() - 10) / 2, (desktop->height() - videoWidget->height() - 70) / 2);
videoWidget->show();
mediaPlayer->play();
}
存在缺陷:
截图无法显示鼠标位置