Qt直接调用ffmpeg实现录屏功能

RecordManager.h

#ifndef RECORD_MANAGER_H
#define RECORD_MANAGER_H

#include <QWidget>
#include <QtGui>
#include "base/common.h"
#include <QProcess>

class RecordManager :public QObject
{
	Q_OBJECT

public:

	void recordScreen();

	void endRecordScreen();

	void playback();

	~RecordManager();

private:
	RecordManager();

private:
	QProcess m_process;
	QString videopath; 

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>
#include <QtGlobal>

RecordManager::RecordManager()
{
	QString path = QDir::currentPath();//当前工作路径
	videopath = path + "/image/screenVideo";

	int index = videopath.lastIndexOf("/");
	QString levelabovPath = videopath.left(index);
	QDir dir(levelabovPath);
	if (!dir.exists()) {
		bool ok = dir.mkdir(levelabovPath);//只创建一级子目录,即必须保证上级目录存在
	}

	dir.setPath(videopath);
	if (!dir.exists()) {
		bool ok = dir.mkdir(videopath);//只创建一级子目录,即必须保证上级目录存在
	}
}

RecordManager::~RecordManager()
{
	
}

void RecordManager::recordScreen()
{
	#ifdef Q_OS_LINUX
		// linux
	#endif

	#ifdef Q_OS_WIN32
		// win
		videopath = QDir::currentPath() + "/image/screenVideo" + "/" +
			QDateTime::currentDateTime().toString("yyyy-MM-dd....hh-mm-ss") + ".mp4";
		m_process.setProcessChannelMode(QProcess::MergedChannels);
		QDir dir("D:/ffmpeg-master-latest-win64-gpl-shared");
		if (!dir.exists()) {
			//日志记录
			//弹窗提示
		}
		QString cmd = QString("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 %1").arg(videopath);
		m_process.start(cmd);
		QString errorstring = m_process.errorString();
	#endif
}

void RecordManager::endRecordScreen()
{
	if (m_process.isOpen())
	{
		m_process.write("q");
	}
}

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android录屏功能实现需要通过使用MediaProjection API来实现。首先,我们需要获取屏幕的图像数据,可以通过MediaProjectionManager类的getMediaProjection()方法来获取用户授权的MediaProjection对象。然后,我们可以使用MediaProjection对象创建VirtualDisplay对象,该对象将屏幕图像数据渲染到一个Surface上。 在创建VirtualDisplay对象时,我们还需要指定渲染图像数据的Surface的参数,比如图像的宽高、dpi等。接下来,我们需要创建一个MediaCodec对象用于对图像数据进行编码,可以选择使用H.264或H.265编码格式。编码过程中,可以选择设置视频的码率、帧率等参数。 在编码完图像数据后,我们可以将编码后的数据保存为一个视频文件。可以使用MediaMuxer类创建一个包含音频轨道和视频轨道的mp4文件。我们需要使用MediaMuxer的addTrack()方法给音频轨道和视频轨道添加数据。编码后的图像数据可以通过MediaCodec的getOutputBuffer()方法获取到,然后写入视频轨道。音频数据可以通过AudioRecord对象获取到,然后写入音频轨道。 最后,我们要记得释放资源。需要调用VirtualDisplay、MediaCodec、MediaMuxer等对象的release()方法释放资源。此外,我们还需要关闭MediaProjection对象。为了保证录屏正常结束,我们可以监听用户按下Home键或其他影响屏幕显示的操作,然后停止录屏并保存视频文件。 总结来说,实现Android录屏功能需要通过获取图像数据、编码、写入文件等步骤来完成。使用MediaProjection API可以方便地获取屏幕图像数据,而MediaCodec和MediaMuxer类可以帮助我们对图像数据进行编码和保存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值