Форум: "Media";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизDxShow+Capturing=problems Найти похожие ветки
← →
Ozone © (2006-02-21 05:45) [0]Добрый день. Есть 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
{...}
← →
Ozone © (2006-02-21 11:09) [1]вопрос снят, всем спасибо.
← →
Belorus © (2006-02-24 18:50) [2]Советую на DSPack посмотреть
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.107 c