Cmake引入opencv 实现录屏功能

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();
}

存在缺陷:

截图无法显示鼠标位置

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值