Directshow在捕获期间调整大小

时间:2012-01-26 21:34:08

标签: c++ window directshow capture

我有一个directshow过滤器,用于使用下面的代码捕获屏幕。

首先,我使用

获取窗口
EnumWindows

这给了我lpRect

HDC         hMemDC;
HBITMAP     hBitmap, hOldBitmap;
int         nX, nY, nX2, nY2;
int         nWidth, nHeight;

if (IsRectEmpty(lpRect))
  return NULL;

hMemDC = CreateCompatibleDC(hScrDC);

nX  = lpRect->left;
nY  = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;

nWidth  = nX2 - nX;
nHeight = nY2 - nY;

hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);

hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap);

BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); 

hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap);

GetDIBits(hScrDC, hRawBitmap, 0, nHeightScanLines, pData, pHeader, DIB_RGB_COLORS);     

DeleteDC(hMemDC);

问题是当我调整我想要捕获的窗口大小时,它应该看起来像这样enter image description here

然而它最终会像这样 enter image description here

我觉得这是由于图像宽度的像素数,但是我不确定如何调整directshow滤镜的输出宽度和高度?

2 个答案:

答案 0 :(得分:0)

当过滤器提供的视频样本的尺寸与协商的尺寸不同时,可能会发生此问题。

如果过滤器应仅捕获窗口内容而不进行裁剪或填充,并且窗口大小发生变化,则应使用下游过滤器重新协商媒体格式。文章Dynamic Format Changes描述了不同的解决方案。另请参阅Custom DirectShow Source Filter - Dynamic Resolution Change以获取示例。

答案 1 :(得分:0)

您的效果是您的缓冲区与您的过滤器在其引脚连接上的媒体类型不匹配。通常,如果过滤器(引脚)错误地处理Handling Format Changes from the Video Renderer中描述的扩展视频步幅更改,则会发生这种情况。

然而,更有可能的是,您正在丢失正在尝试调整大小的正确媒体类型。您的代码实际上没有进行任何大小调整,并且正如您可能希望调整大小一样,填充的缓冲区最终会使连接上的媒体类型不匹配。