这是实际的主要代码,预览效果很好:
int main()
{
HRESULT hr = CoInitialize(NULL);
ICaptureGraphBuilder2 *pBuild;
IGraphBuilder *pGraph;
IMoniker *pMoniker;
IMediaControl *pControl;
IMediaEvent *pEvent;
InitCaptureGraphBuilder(&pGraph, &pBuild);
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
IBaseFilter *pCap; // Video capture filter
IEnumMoniker *pEnum;
hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
DisplayDeviceInformation(pEnum, &pMoniker);
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
if (SUCCEEDED(hr))
{
hr = pGraph->AddFilter(pCap, L"Capture Filter");
}
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);
hr = pControl->Run();
_getch();
pControl->Release();
pCap->Release();
pGraph->Release();
pBuild->Release();
CoUninitialize();
return 0;
}
现在,我知道为了录制我需要这段代码:
IBaseFilter *pMux;
hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi, L"D:\\test.avi", &pMux, NULL);
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, NULL, pMux);
如果我将其替换为预览代码,它实际上会创建 AVI 文件(一个非常大的文件),但它是空的,没有视频。 我的意思是我要替换:
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);
代码,同上。
我做错了什么,或者更好的是,我错过了什么?
最佳答案
RenderStream
是高级方法,通过公开记录的 API 在内部嵌入其他调用,通常是为了便于使用。虽然它看起来很简单,但如果某些东西不能按预期正常工作,则排除故障并不容易。更难说仅通过视觉检查代码。它也不是最有效的,因为您可以自己做一些事情来接近解决方案,即:
您的进一步步骤是沿着以下两者中的任何一个:
您当然还需要检查 HRESULT
代码,您似乎已经在这样做了。
关于c++ - DirectShow 困境 - 无法录制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17020251/