Ошибка Microsoft SDK AMCap GetCurrentImage

Я пытаюсь изменить существующее приложение AmCap, доступное через примеры Microsoft DirectK ​​SDK, чтобы получить изображение захваченного потока при нажатии кнопки пробела. Ниже приводится точка, в которой я работаю с клавишей пробела.

        case WM_KEYDOWN:
if((GetAsyncKeyState(VK_ESCAPE) & 0x01) && gcap.fCapturing)
{
StopCapture();
if(gcap.fWantPreview)
{
BuildPreviewGraph();
StartPreview();
}
}
else if ((GetAsyncKeyState(VK_SPACE) & 0x01))
{
IMediaControl *pMC = NULL;
HRESULT hr = gcap.pFg->QueryInterface(IID_IMediaControl, (void **)&pMC);

if (SUCCEEDED(hr)){
hr=pMC->Pause();
if (SUCCEEDED(hr)){
CaptureImage(TEXT("C:\\output.bmp"));
pMC->Run();
pMC->Release();
}else
ErrMsg(TEXT("Failed to pause stream!  hr=0x%x"), hr);
}
else
ErrMsg(TEXT("Cannot grab image"));
}
break;

Ниже приведено содержимое функции CaptureImage.

HRESULT hr;

SmartPtr<IBasicVideo> pWC;

// If we got here, gcap.pVW is not NULL
ASSERT(gcap.pVW != NULL);
hr = gcap.pVW->QueryInterface(IID_IBasicVideo, (void**)&pWC);

if (pWC)
{
long bufSize;
long *lpCurrImage = NULL;
pWC->GetCurrentImage(&bufSize, NULL);

lpCurrImage = (long *)malloc(bufSize);
//

// Read the current video frame into a byte buffer.  The information
// will be returned in a packed Windows DIB and will be allocated
// by the VMR.
hr = pWC->GetCurrentImage(&bufSize, lpCurrImage);
if (SUCCEEDED(hr))
{
HANDLE fh;
BITMAPFILEHEADER bmphdr;
BITMAPINFOHEADER bmpinfo;
DWORD nWritten;

memset(&bmphdr, 0, sizeof(bmphdr));
memset(&bmpinfo, 0, sizeof(bmpinfo));

bmphdr.bfType = ('M' << 8) | 'B';
bmphdr.bfSize = sizeof(bmphdr) + sizeof(bmpinfo) + bufSize;
bmphdr.bfOffBits = sizeof(bmphdr) + sizeof(bmpinfo);

bmpinfo.biSize = sizeof(bmpinfo);
bmpinfo.biWidth = 640;
bmpinfo.biHeight = 480;
bmpinfo.biPlanes = 1;
bmpinfo.biBitCount = 32;

fh = CreateFile(TEXT("C:\\Users\\mike\\Desktop\\output.bmp"),
GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL);
WriteFile(fh, &bmpinfo, sizeof(bmpinfo), &nWritten, NULL);
WriteFile(fh, lpCurrImage, bufSize, &nWritten, NULL);
CloseHandle(fh);

ErrMsg(TEXT("Captured current image to %s"),  szFile);
return TRUE;
}
else
{
ErrMsg(TEXT("Failed to capture image!  hr=0x%x"), hr);
return FALSE;
}
}

return FALSE;

Проблема в том, что когда я пытаюсь запустить приложение, я получаю ошибку HRESULT (0x8000ffff), когда вызывается функция GetCurrentImage.

С другой стороны, в случае, если я запускаю приложение через отладчик VS, код работает просто отлично.

Я попытался добавить Sleep сразу после потока pMC-> Pause (), предполагая, что проблема связана с синхронизацией, но это не сработало.

Любые идеи будут чрезвычайно полезны!

Заранее спасибо.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]