![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DxShow+Capturing=problems [D7, WinXP]
Ozone © (2006-02-21 05:45:00)Добрый день. Есть web-камера, хочу сразу делать превью и капчуринг в bmp по запросу.
Сегодня на "коленках" собрал вот такой код, но при попытке считать хотябы размер буфера нифига не получается...
Может кто подскажет где я дал маху... Заранее спасибо.
pBuild : ICaptureGraphBuilder2;
pGraph : IGraphBuilder;
hr : HWND;
pCap : IBaseFilter;
pMoniker : IMoniker;
pDevEnum : ICreateDevEnum;
pEnum : IEnumMoniker;
MC : IMediaControl;
ME : IMediaEventEx;
VW : IVideoWindow;
pSampleGrabber : IBaseFilter;
pGrabber : ISampleGrabber;
mt : TAM_MEDIA_TYPE;
{...}
{ **** ПОСТРОЕНИЕ ГРАФА ****}
pGraph := nil;
pBuild := nil;
hr := CoCreateInstance(CLSID_CaptureGraphBuilder2, nil,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, pBuild );
if SUCCEEDED(hr) then begin
hr := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, pGraph);
if SUCCEEDED(hr) then begin
pBuild.SetFiltergraph(pGraph);
end
else pBuild := nil;
end
else ShowMessage('Error_2');
pCap := nil;
pMoniker := nil;
// Create the system device enumerator
pDevEnum := nil;
hr := CoCreateInstance(CLSID_SystemDeviceEnum, nil, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, pDevEnum);
if (FAILED(hr)) then ShowMessage('7');
// Create an enumerator for the video capture devices
pEnum := nil;
hr := pDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, pEnum, 0);
// берем первое что попалось
if (pEnum.Next(1, pMoniker, nil) = S_OK) then begin
// Bind Moniker to a filter object
hr := pMoniker.BindToObject(nil,nil,IID_IBaseFilter, pCap);
if (FAILED(hr)) then ShowMessage('9');
hr := pGraph.AddFilter(pCap, 'Capture Filter');
if (FAILED(hr)) then ShowMessage('10');
end;
hr := pBuild.RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, pCap, nil, nil);
hr := pGraph.QueryInterface(IID_IMediaControl, MC);
if (FAILED(hr)) then ShowMessage('13');
hr := pGraph.QueryInterface(IID_IMediaEvent, ME);
if (FAILED(hr)) then ShowMessage('14');
hr := pGraph.QueryInterface(IID_IVideoWindow, VW);
if (FAILED(hr)) then ShowMessage('15');
{ Insert grabber}
hr := CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC, IID_IBaseFilter, pSampleGrabber) ;
if (FAILED(hr)) or (pSampleGrabber = nil) then ShowMessage('11');
hr := pSampleGrabber.QueryInterface(IID_ISampleGrabber, pGrabber);
if (FAILED(hr)) then ShowMessage('19');
// set media type
mt.majortype := MEDIATYPE_Video;
mt.subtype := MEDIASUBTYPE_RGB24;
hr := pGrabber.SetMediaType(mt);
if (FAILED(hr)) then ShowMessage('16');
hr := pGraph.AddFilter(pSampleGrabber, 'Sample Grabber');
if (FAILED(hr)) then ShowMessage('12');
pSampleGrabber := nil;
pGrabber.SetOneShot(FALSE);
pGrabber.SetBufferSamples(TRUE);
VW.put_owner(Panel.Handle);
VW.put_top(0);
VW.put_left(0);
VW.put_width(320);
VW.put_height(240);
VW.put_windowstyle(WS_CHILD);
{...}
{*** RUN GRAPH ***}
MC.Run;
while (State_Running <> tmp) do
MC.GetState(100, tmp);
{...}
{*** CAPTURE IMAGE ***}
cbBuffer : longint;
pBuffer : pChar;
{...}
cbBuffer := 0;
hr := pGrabber.GetCurrentBuffer(cbBuffer, 0); // здесь всегда cbBuffer равно 0
{...}
Belorus (2006-02-24 18:50:00) [1]Советую на DSPack посмотреть
Ozone (2006-02-21 11:09:00) [2]вопрос снят, всем спасибо.