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);
-
- //初始化GDI
- Gdiplus::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:保存视频帧到文件