Помогите с захватом видео

  • Автор темы RG84
  • Дата начала
R

RG84

Гость
#1
задача следующая:
требуется получить видео с камеры подключенной к компу.
посоветуйте как это лучше сделать. и если не трудно приведите примерчик. :huh:
 
R

RG84

Гость
#2
Нашла вот такой пример

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 и из-за этого далише ничего не работает... :)
посоветуйте что с этим делать???
 
R

RG84

Гость
#4
да
более того усли вместо CLSID_VideoInputDeviceCategory поставить AM_KSCATEGORY_CAPTURE
то почти работает...
но прога не заходит в
if (SUCCEEDED(hr) && (wcscmp(bstrName, varName.bstrVal) == 0))
{
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter);
break;
}
и из-за этого не работает
 
S

sdriver

Гость
#5
Для уточнения ошибки:
1. Вставь проверку на связывание с IPropertyBag
Код:
	 hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
(void **)&pProp); 
if (SUCCEEDED(hr))
2. Что конкретно не проходит (SUCCEEDED(hr)) или wcscmp(bstrName, varName.bstrVal)?
И какое у тебя значения varName.bstrVal?
Код:
 if (SUCCEEDED(hr) && (wcscmp(bstrName, varName.bstrVal) == 0))
{
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter);
break;
}
 
R

RG84

Гость
#6
1 проверку вставила
2 не проходило wcscmp(bstrName, varName.bstrVal)
я зделала по другому (правдо не знаю на ск это правелно или нет)
hr = pProp->Read(L"FriendlyName", &varName, 0);
wchar_t *Name=varName.bstrVal;

char *mbst = (char*)malloc( MB_CUR_MAX);
char *mbst1 = (char*)malloc( MB_CUR_MAX);
int x = wcstombs(mbst,bstrName, MB_CUR_MAX);
int x1 = wcstombs(mbst1,Name, MB_CUR_MAX);

if (SUCCEEDED(hr) && (strcmp(mbst,mbst1) == 0))

{
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter);
break;
}

и теперь не выполняется
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
);
 
S

sdriver

Гость
#7
А проверки на все стоят?B частности на все что касается pSrc, // Capture filter
 
R

RG84

Гость
#8
пока не на все....
но при пошаговом выполнение вроде все что с ним связано нормално выполняется (hr=0)
 
R

RG84

Гость
#9
посоветуйте что исправить или что сделать...плиз....
очень надо!!!!
 
R

RG84

Гость
#11
я их вначале описала
GUID MEDIASUBTYPE_Avi1 ={0xe436eb88, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70};
GUID PIN_CATEGORY_CAPTURE1={0xfb6c4281, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba };
GUID MEDIATYPE_Video1={0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71};
GUID PIN_CATEGORY_PREVIEW1={0xfb6c4282, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba };
GUID CLSID_VideoInputDeviceCategory1={0x860BB310,0x5D01,0x11d0,0xBD,0x3B,0x00,0xA0,0x
C9,0x11,0xCE,0x86};
GUID AM_KSCATEGORY_CAPTURE1={0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96};
GUID MEDIATYPE_Interleaved1={0x73766169, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71};
иначе, при MEDIATYPE_Video, выдавалась ошибка... мол такого не знает