博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
win32截屏并rgb24转yuv420
阅读量:6202 次
发布时间:2019-06-21

本文共 2194 字,大约阅读时间需要 7 分钟。

hot3.png

void ScreenCap(void* buf, int w, int h){     HWND hDesk = GetDesktopWindow();    HDC hScreen = GetDC(hDesk);    int width = w;//GetDeviceCaps(hScreen, HORZRES);    int height = h;//GetDeviceCaps(hScreen, VERTRES);    // if (w != 0)   //     *w = width;   // if (h != 0)    //    *h = height;     HDC hdcMem = CreateCompatibleDC(hScreen);    HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, width, height);     BITMAPINFOHEADER bmi = { 0 };    bmi.biSize = sizeof(BITMAPINFOHEADER);    bmi.biPlanes = 1;    bmi.biBitCount = 24;    bmi.biWidth = width;    bmi.biHeight = height;    bmi.biCompression = BI_RGB;    bmi.biSizeImage = width*height;     SelectObject(hdcMem, hBitmap);    BitBlt(hdcMem, 0, 0, width, height, hScreen, 0, 0, SRCCOPY);     GetDIBits(hdcMem, hBitmap, 0, height, buf, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);     DeleteDC(hdcMem);    ReleaseDC(hDesk, hScreen);    CloseWindow(hDesk);    DeleteObject(hBitmap);}   //// rgb转yuv420//bool  RGB2YUV(unsigned char* RgbBuf,UINT nWidth,UINT nHeight,LPBYTE yuvBuf,unsigned long len){	int i, j;	unsigned char*bufY, *bufU, *bufV, *bufRGB,*bufYuv;	memset(yuvBuf,0,nWidth*nHeight*1.5);	bufY = yuvBuf;	bufV = yuvBuf + nWidth * nHeight;	bufU = bufV + (nWidth * nHeight* 1/4); 	unsigned char y, u, v, r, g, b,testu,testv;	unsigned int ylen = nWidth * nHeight;	unsigned int ulen = (nWidth * nHeight)/4;	unsigned int vlen = (nWidth * nHeight)/4; 	for (j = 0; j
> 8) + 16 ; u = (unsigned char)( ( -38 * r - 74 * g + 112 * b + 128) >> 8) + 128 ; v = (unsigned char)( ( 112 * r - 94 * g - 18 * b + 128) >> 8) + 128 ; *(bufY++) = max( 0, min(y, 255 )); if (j%2==0&&i%2 ==0) { if (u>255) { u=255; } if (u<0) { u = 0; } *(bufU++) =u; //存u分量 } else { //存v分量 if (i%2==0) { if (v>255) { v = 255; } if (v<0) { v = 0; } *(bufV++) =v; } } } } //len = nWidth * nHeight+(nWidth * nHeight)/2; return true;} char*rgb=new char[width*height*3];ScreenCap(rgb,width,height);RGB2YUV((unsigned char*)rgb,width,height, yuv_buffer,0);

这样获得的yuv420 可以直接x264 encode 压缩成视频。即屏幕录像或者屏幕直播 

转载于:https://my.oschina.net/simawei/blog/2207448

你可能感兴趣的文章
nginx 是如何处理访问请求的
查看>>
wget参数用法详解
查看>>
使用curl命令查看访问url的时间
查看>>
WinForm中跨线程操作控件
查看>>
CODING 敏捷实践完全指南
查看>>
unittest测试框架和测试报告的输出实例(一)
查看>>
下MFC中对象、句柄、ID之间的区别.
查看>>
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
查看>>
Asp.Net MVC 分页、检索、排序整体实现
查看>>
Flymeos插桩适配教程
查看>>
还在用PS磨皮去皱?看看如何用神经网络高度还原你的年轻容貌!
查看>>
大端模式与小端模式、网络字节顺序与主机字节顺序
查看>>
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
制作一款微信表情
查看>>
高仿Instagram 页面效果android特效
查看>>
我的友情链接
查看>>
Juniper 基于路由的×××
查看>>
HDU - 2018 - 母牛的故事(dp)
查看>>
基于matlab的fft变换中参数的设置
查看>>
如何查找JSP页面中的错误
查看>>