我有一个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);
问题是当我调整我想要捕获的窗口大小时,它应该看起来像这样
然而它最终会像这样
我觉得这是由于图像宽度的像素数,但是我不确定如何调整directshow滤镜的输出宽度和高度?
答案 0 :(得分:0)
当过滤器提供的视频样本的尺寸与协商的尺寸不同时,可能会发生此问题。
如果过滤器应仅捕获窗口内容而不进行裁剪或填充,并且窗口大小发生变化,则应使用下游过滤器重新协商媒体格式。文章Dynamic Format Changes描述了不同的解决方案。另请参阅Custom DirectShow Source Filter - Dynamic Resolution Change以获取示例。
答案 1 :(得分:0)
您的效果是您的缓冲区与您的过滤器在其引脚连接上的媒体类型不匹配。通常,如果过滤器(引脚)错误地处理Handling Format Changes from the Video Renderer中描述的扩展视频步幅更改,则会发生这种情况。
然而,更有可能的是,您正在丢失正在尝试调整大小的正确媒体类型。您的代码实际上没有进行任何大小调整,并且正如您可能希望调整大小一样,填充的缓冲区最终会使连接上的媒体类型不匹配。