对软件客户区进行视频录制,采用截图+压缩至avi的做法,得到的avi视频画面总是有明显的线条,求问如何解决?

skyhover2014 2017-08-08 01:36:10
得到的视频画面:

可以看到视频画面上有明显的一行一行的线条

截图直接保存的图片:

图片则是完好的

压缩代码:
void CRobotAppView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

if(m_timer)//如果上一次的定时器程序已经运行完,才执行下面的代码
{
m_timer=FALSE;//本次定时,正在运行,未结束前,不得进行下次运行
CView* pView;
CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->GetMainWnd();
CMDIChildWnd *pChild = (CMDIChildWnd*)pFrame->GetActiveFrame();
pView = (CRobotAppView*)pChild->GetActiveView();
CRect rc;
pView->GetWindowRect(rc);
CDC * pClientDC =pView->GetDC();
CDC memDC;//定义一个内存画布
memDC.CreateCompatibleDC(pClientDC);//创建一个兼容的画布
CBitmap bmp;
bmp.CreateCompatibleBitmap(pClientDC,rc.Width(),rc.Height());//创建兼容位图
memDC.SelectObject(&bmp);//选中位图对象
BITMAP bitmap;
bmp.GetBitmap(&bitmap);
CDC* pDeskDC =GetDesktopWindow()->GetDC();//获取桌面画布对象 获取桌面窗口上下文环境的指针(句柄)

memDC.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,pDeskDC,rc.left,rc.top,SRCCOPY);

DWORD size=bitmap.bmWidthBytes * bitmap.bmHeight;//屏幕图像的总像素数
lpData = new BYTE[size];
int panelsize = 0; //记录调色板大小
if(bitmap.bmBitsPixel<16)//判断是否为真彩色位图
panelsize = (int)pow((float)2,(int)(bitmap.bmBitsPixel*sizeof(RGBQUAD)));
//填充BITMAPFILEHEADER
BITMAPFILEHEADER bitmapFileHeader;
memset(&bitmapFileHeader,0,sizeof(BITMAPFILEHEADER));
bitmapFileHeader.bfSize = sizeof(BITMAPFILEHEADER);
bitmapFileHeader.bfType = 0x4d42; //BM

bitmapFileHeader.bfOffBits =sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);


BITMAPINFOHEADER *pBInfo = new BITMAPINFOHEADER;//定义位图信息头结构体
//初始化位图信息头
pBInfo->biBitCount = bitmap.bmBitsPixel;
pBInfo->biClrImportant = 0;
pBInfo->biCompression = 0;
pBInfo->biHeight = bitmap.bmHeight;
pBInfo->biPlanes = bitmap.bmPlanes;
pBInfo->biSize = sizeof(BITMAPINFOHEADER);
pBInfo->biSizeImage = bitmap.bmWidthBytes*bitmap.bmHeight;
pBInfo->biWidth = bitmap.bmWidth;
pBInfo->biXPelsPerMeter = 0;
pBInfo->biYPelsPerMeter = 0;
BITMAPINFO bInfo;//定义位图信息结构体
bInfo.bmiHeader = *pBInfo;//初始化

GetDIBits(memDC.m_hDC,bmp,0, pBInfo->biHeight,lpData,&bInfo,DIB_RGB_COLORS);// 获取屏幕位图的DIB数据(生成avi需要),保存到lpdata


if(nFrames == 0)//如果是第一帧
{
AVISTREAMINFO strhdr;//视频数据流结构
AVIFileOpen(&pfile,m_VedioName,OF_WRITE | OF_CREATE,NULL);//打开或创建AVI文件
/////////////初始化AVI视频流信息结构体
memset(&strhdr, 0, sizeof(strhdr));//初始化信息头为0
strhdr.fccType = streamtypeVIDEO;
strhdr.fccHandler = mmioStringToFOURCC(_T("MSVC"), 0);
strhdr.dwScale = 1;
strhdr.dwRate = m_VedioFrame;
strhdr.dwSuggestedBufferSize = pBInfo->biSizeImage;
SetRect(&strhdr.rcFrame,0,0,pBInfo->biWidth,pBInfo->biHeight);
AVIFileCreateStream(pfile,&pS,&strhdr);//创建AVI文件流

//设置压缩选项,创建压缩流
AVICOMPRESSOPTIONS pCompressOption;
AVICOMPRESSOPTIONS* opts[1] = {&pCompressOption};
memset(&pCompressOption,0,sizeof(pCompressOption));
opts[0]->fccType = streamtypeVIDEO;
opts[0]->fccHandler = mmioStringToFOURCC(_T("MSVC"), 0);
opts[0]->dwQuality = 10000;//original :7500
opts[0]->dwBytesPerSecond = 1000;//original :0
opts[0]->dwFlags = AVICOMPRESSF_VALID || AVICOMPRESSF_KEYFRAMES;
opts[0]->lpFormat = 0;
opts[0]->cbFormat = 0;
AVIMakeCompressedStream(&pComStream,pS,&pCompressOption,NULL);
AVIStreamSetFormat(pComStream,0,pBInfo,sizeof(BITMAPINFOHEADER));
}
AVIStreamWrite(pComStream,nFrames ,1,(LPBYTE)lpData,pBInfo->biSizeImage,AVIIF_KEYFRAME,NULL,NULL);//将桌面图像数据写入文件
nFrames++;//增加一帧
delete []lpData;//释放内存
delete pBInfo ; //释放内存
ReleaseDC(pClientDC);
ReleaseDC(pDeskDC);
ReleaseDC(&memDC);
m_timer=TRUE;//定时器程序可以继续响应

}
CBaseView::OnTimer(nIDEvent);
}
...全文
273 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2017-08-22
  • 打赏
  • 举报
回复
搞笑了。这是因为原图32位 高分辨率的吧。 而视频压缩肯定图片损失了。背景渐变色。而压缩图片渐变很占空间,就变成了阶梯变色
skyhover2014 2017-08-11
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
渐变色太多。 建议调整软件客户区背景不显示渐变色。
谢谢赵老师,但是为什么截图的时候就没有这种现象呢?由于客户区背景是按要求做成那样的,所以不能改背景,请问还有别的方法吗?
赵4老师 2017-08-09
  • 打赏
  • 举报
回复
渐变色太多。 建议调整软件客户区背景不显示渐变色。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧