Нашла вот такой пример
HRESULT FindMyCaptureDevice(IBaseFilter **pF, BSTR bstrName)
{
HRESULT hr = E_FAIL;
CComPtr<IBaseFilter> pFilter;
CComPtr<ICreateDevEnum> pSysDevEnum;
CComPtr<IEnumMoniker> pEnumCat = NULL;
// Create the System Device Enumerator.
pSysDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum);
pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
// Enumerate the monikers.
CComPtr<IMoniker> pMoniker;
ULONG cFetched;
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
CComPtr<IPropertyBag> pProp;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pProp);
VARIANT varName;
VariantInit(&varName); // Try to match the friendly name.
hr = pProp->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr) && (wcscmp(bstrName, varName.bstrVal) == 0))
{
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter);
break;
}
VariantClear(&varName);
pMoniker = NULL; // Release for the next loop.
}
*pF = pFilter;
(*pF)->AddRef(); // Add ref on the way out.
return hr;
}
void DoCapture()
{
// e436eb88-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_Avi
HRESULT hr;
CComBSTR bstrName("My Camera Device");
CComPtr<IBaseFilter> pSrc;
CComPtr<IGraphBuilder> pGraph=NULL;
CComPtr<ICaptureGraphBuilder2> pBuilder=NULL;
// Create the filter graph.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **)&pGraph);
// Create the capture graph builder.
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **)&pBuilder);
pBuilder->SetFiltergraph(pGraph);
hr = FindMyCaptureDevice(&pSrc, bstrName);
hr = pGraph->AddFilter(pSrc, L"Capture");
// Create the file-writing portion.
CComPtr<IBaseFilter> ppf;
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi1,
L"C:\\Example.avi", &ppf, NULL);
// Render streams.
hr = pBuilder->RenderStream(
&PIN_CATEGORY_CAPTURE1, // Pin category
&MEDIATYPE_Video1, // Media type
pSrc, // Capture filter
NULL, // Compression filter (optional)
ppf // Multiplexer or renderer filter
);
hr = pBuilder->RenderStream(
&PIN_CATEGORY_PREVIEW1, // Pin category
&MEDIATYPE_Video1, // Media type
pSrc, // Capture filter
NULL, // Compression filter (optional)
NULL // Default renderer
);
// Run the graph.
const long ONE_SECOND = 10000000;
REFERENCE_TIME rtStart = 5 * ONE_SECOND , rtStop = 10 * ONE_SECOND;
hr = pBuilder->ControlStream(&PIN_CATEGORY_CAPTURE1, &MEDIATYPE_Video1,
pSrc, &rtStart, &rtStop, 0, 0);
if (FAILED(hr))
{
printf("Failed ControlStream.\n");
return;
}
CComQIPtr<IMediaControl> pControl(pGraph);
CComQIPtr<IMediaEventEx> pEvent(pGraph);
hr = pControl->Run();
while (1)
{
long evCode, lParam1, lParam2;
hr = pEvent->GetEvent(&evCode, &lParam1, &lParam2, 100);
if (hr == S_OK)
{
hr = pEvent->FreeEventParams(evCode, lParam1, lParam2);
if (evCode == EC_STREAM_CONTROL_STARTED)
{
printf("Starting capture...\n");
}
else if (evCode == EC_STREAM_CONTROL_STOPPED)
{
break;
}
}
}
pControl->Stop();
printf("... Done\n");
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CoInitialize(NULL);
DoCapture();
CoUninitialize();
}
//--------------------------------------------------------------------
но почемуто в
pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
pEnumCat получается NULL и из-за этого далише ничего не работает...
посоветуйте что с этим делать???