屏幕捕获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 (