1:调用windows GDI
bool WindowsGDI::init(int idx) {mHWinSta = GetProcessWindowStation();if (!mHWinSta) {LOGE("%s GetProcessWindowStation error", getCapture());return false;}mHWnd = GetDesktopWindow();//GetActiveWindow();mWndHDC = GetDC(mHWnd);//初始化GDIGdiplus::GdiplusStartupInput gdiplusStartupInput;if (Gdiplus::GdiplusStartup(&mGdiplusToken, &gdiplusStartupInput, nullptr) != Gdiplus::Ok){LOGE("%s Gdiplus::GdiplusStartup error", getCapture());return false;}mCaptureHDC = CreateCompatibleDC(mWndHDC);mCaptureHBitmap = CreateCompatibleBitmap(mWndHDC, mWidth, mHeight);SelectObject(mCaptureHDC, mCaptureHBitmap);//将位图选入创建好的兼容句柄mBmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);mBmpInfo.bmiHeader.biWidth = mWidth;mBmpInfo.bmiHeader.biHeight = -mHeight;mBmpInfo.bmiHeader.biPlanes = 1;mBmpInfo.bmiHeader.biBitCount = 24;mBmpInfo.bmiHeader.biCompression = BI_RGB;mBmpInfo.bmiHeader.biSizeImage = 0;mBmpInfo.bmiHeader.biXPelsPerMeter = 0;mBmpInfo.bmiHeader.biYPelsPerMeter = 0;mBmpInfo.bmiHeader.biClrUsed = 0;mBmpInfo.bmiHeader.biClrImportant = 0;mRGB_size = mWidth * mHeight * 3;//24位图像大小mRGB = (PRGBTRIPLE)malloc(mRGB_size);//通过接口获取屏幕宽高,不准确//mFactWidth = GetSystemMetrics(SM_CXSCREEN);//mFactHeight = GetSystemMetrics(SM_CYSCREEN);mFactWidth = mWidth;mFactHeight = mHeight;return true;}
2:获取视频帧
bool WindowsGDI::getFrame(uint8_t* buffer, int& size, int64_t& timestamp) {timestamp = getCurTimestamp();BitBlt(mCaptureHDC, 0, 0, mWidth, mHeight, mWndHDC, 0, 0, SRCCOPY);GetDIBits(mCaptureHDC,mCaptureHBitmap,0, mHeight, mRGB, (LPBITMAPINFO)&mBmpInfo, DIB_RGB_COLORS);memcpy(buffer, mRGB, mRGB_size);size = mRGB_size;return true;}
3:保存视频帧到文件