![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Попытка видеозахвата (DirectShow) [D7, WinXP]
Исследователь © (2005-08-25 05:26:00)Добрый день мастера!
Начал потихоньку изучать DirectShow, залез на MSDN и попробовал воспроизвести все по их описанию... но к сожалению до конца не разобрался и с первого раза ничего не получилось... :)
Может, кто хорошо знаком с данной темой ткнет пальцем в "неверное место в коде".
var
pGraph : IGraphBuilder = nil;
pBuild : ICaptureGraphBuilder2 = nil;
pCap : IBaseFilter = nil;
pDevEnum : ICreateDevEnum = nil;
pEnum : IEnumMoniker = nil;
pMoniker : IMoniker = nil;
pPropBag : IPropertyBag = nil;
{...}
var
HR : HRESULT;
varName : OleVariant;
s : string;
begin
hr := CoCreateInstance(CLSID_CaptureGraphBuilder2, nil, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, pBuild);
if FAILED(hr) then begin
ShowMessage('1');
exit;
end;
hr := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, pGraph);
if FAILED(hr) then begin
ShowMessage('2');
exit;
end;
pBuild.SetFiltergraph(pGraph);
// create system device enumerator.
hr := CoCreateInstance(CLSID_SystemDeviceEnum, nil,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, pDevEnum);
if FAILED(hr) then begin
ShowMessage('3');
exit;
end;
hr := pDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, pEnum, 0);
if FAILED(hr) then begin
ShowMessage('4');
exit;
end;
// select device
while (pEnum.Next(1, pMoniker, nil) = S_OK) do begin
if (pMoniker.BindToStorage(nil, nil, IID_IPropertyBag, pPropBag) = S_OK) and (pPropBag<>nil) then begin
pPropBag.Read('FriendlyName', varName, nil);
s := varName;
MainForm.List.Items.Add(s);
end;
end;
// create capture filter
hr := pMoniker.BindToObject(nil, nil, IID_IBaseFilter, pCap);
if FAILED(hr) then begin
ShowMessage('5');
exit;
end;
// add filter into graph
hr := pGraph.AddFilter(pCap, 'Capture Filter');
if FAILED(hr) then begin
ShowMessage('6');
exit;
end;
// build video preview graph
hr := pBuild.RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, pCap, nil, nil);
end;
Заранее спасибо.
Исследователь (2005-08-25 05:29:00) [1]Да, совсем забыл уточнить делали :)
Пробую сделать превью с вебкамеры. Ошибка AV Read of address 00000000 на строчке:
hr := pMoniker.BindToObject(nil, nil, IID_IBaseFilter, pCap);