VC++ 屏幕捕获(DXGI)

本文详细介绍了如何使用VC++通过DXGI库实现屏幕捕获,特别是RGB数据的回调函数和接口定义。在1920*1080分辨率下,采用GXDI方式可以达到大约60帧/秒的实时帧率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

屏幕捕获RGB数据回调函数(CVideoCapture.h):

#ifndef _VIDEODATA_CALLBACK_
#define _VIDEODATA_CALLBACK_
typedef void(*LPVideoDataRealCallback)(unsigned char *pRgbData, int size, int width, int height, void* pContext);
#endif

调用接口定义(CVideoCapture.h):

// DXGI方式,设置视频回调函数,并开始捕获视频数据
AVFILTER_API void* DXGI_VideoSourceStartCapture(int left, int top, int width, int height, LPVideoDataRealCallback pCallback, void* pUser);
// 停止视频数据捕获
AVFILTER_API bool DXGI_VideoSourceStopCapture(void* pSource);

实现源码(CVideoCapture.c):

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <d3d11.h>
#include <dxgi1_2.h>

#pragma comment(lib, "d3d11")
#pragma comment(lib, "dxgi")

#ifndef _VIDEO_SOURCE_
#define _VIDEO_SOURCE_
typedef struct tDXGIVideoSource
{
	int		m_nLeft;//捕获区域坐标值-左
	int		m_nTop;//捕获区域坐标值-上
	int		m_nWidth;//捕获区域-宽度
	int		m_nHeight;//捕获区域-高度

	bool					m_bCaptureCursor;//是否抓取光标
	bool					m_bActive;//是否激活,即是否获取到视频帧
	HANDLE					m_hCaptureThread;//捕获线程句柄
	HANDLE					m_hStopSignal;//线程停止信号

	CRITICAL_SECTION		m_csMemLock;//数据访问互斥锁
	void*					m_memRawBuffer;//RGB数据存放缓冲区
	int						m_nMemSize;//RGB数据缓冲区大小

	ID3D11Device           *m_hDevice;//设备对象
	ID3D11DeviceContext    *m_hContext;//设备上下文
	IDXGIOutputDuplication *m_hDeskDupl;//桌面对象
	DXGI_OUTPUT_DESC        m_dxgiOutDesc;//桌面对象描述-保存了桌面分辨率等信息

	LPVideoDataRealCallback m_pVideoDataRealCalBack;//实时捕获数据回调函数
	void* m_pVideoDataRealCalBackUser;//实时捕获数据用户接受对象
}DXGIVideoSource, *LPDXGIVideoSource;
#endif

//申请一个视频源对象
void DXGIAllocVideoResource(LPDXGIVideoSource* pSource);
//释放视频源对象
void DXGIReleaseVideoResource(LPDXGIVideoSource pSource);
//开始捕获视频数据
bool DXGIStartVideoCapture(LPDXGIVideoSource pSource);
//停止捕获视频数据
void DXGIStopVideoCapture(LPDXGIVideoSource pSource);
//视频数据循环捕获线程
DWORD WINAPI DXGIOnVideoCaptureThread(LPVOID param);
//视频数据捕获函数
bool DXGIDoVideoCapture(LPDXGIVideoSource pSource);
//视频数据捕获函数
bool DXGIProcessVideoCaptureData(LPDXGIVideoSource pSource);

const IID IID_IDXGIDevice = { 0x54ec77fa, 0x1377, 0x44e6, { 0x8c, 0x32, 0x88, 0xfd, 0x5f, 0x44, 0xc8, 0x4c } };
const IID IID_IDXGIAdapter = { 0x2411e7e1, 0x12ac, 0x4ccf, { 0xbd, 0x14, 0x97, 0x98, 0xe8, 0x53, 0x4d, 0xc0 } };
const IID IID_IDXGIOutput1 = { 0x00cddea8, 0x939b, 0x4b83, { 0xa3, 0x40, 0xa6, 0x85, 0x22, 0x66, 0x66, 0xcc } };
const IID IID_ID3D11Texture2D = { 0x6f15aaf2, 0xd208, 0x4e89, { 0x9a, 0xb4, 0x48, 0x95, 0x35, 0xd3, 0x4f, 0x9c } };
const IID IID_IDXGISurface = { 0xcafcb56c, 0x6ac3, 0x4889, { 0xbf, 0x47, 0x9e, 0x23, 0xbb, 0xd2, 0x60, 0xec } };
#define RESET_OBJECT(A) {if (
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值