Изменение направления Directshow во время захвата - PullRequest
0 голосов
/ 27 января 2012

У меня есть фильтр 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 голосов
/ 27 января 2012

Эффект, который вы получаете, состоит в том, что ваши буферы не соответствуют типу носителя, который ваш фильтр имеет на своем контактном соединении.Как правило, это происходит, если фильтры (выводы) неправильно обрабатывают расширенные изменения видеоданных, как описано в Обработка изменений формата с помощью Video Renderer .

Более вероятно, что в вашем случае вы проигрываете правильный носительТип пытается изменить размер.Ваш код на самом деле не производит никакого изменения размера, и, как вы, возможно, ожидаете, что изменение размера произойдет, ваши заполненные буферы в итоге не будут соответствовать типу носителя в соединении.

0 голосов
/ 27 января 2012

Эта проблема может возникнуть, если фильтр предоставляет образец видео с размерами, отличными от согласованных.

Если фильтр должен захватывать только содержимое окна без обрезки или заполнения, а размер окна изменяется, то он должен пересмотреть формат мультимедиа с нижестоящим фильтром. Статья Динамические изменения формата описывает различные решения. Также см. Пользовательский фильтр источника DirectShow - Динамическое изменение разрешения для примера.

...