Текущий архив: 2007.09.16;
Скачать: CL | DM;
ВнизSampleGrabber не работает Найти похожие ветки
← →
devastator (2006-12-08 00:44) [0]В общем, я получаю изображение с веб-камеры и при помощи SampleGrabber выдираю из него отдельные кадры. Почему-то у меня дома и на работе все работает нормально, а в универе - все операции выполняются успешно, но
pGrabber.GetCurrentBuffer(szi,framebuffer[0]);
заполняет буфер нулями. Проверял на пяти компах в универе, на всех пяти одно и то же. DirectX с одного дистрибутива стоит... Буфер кадра заполнен нулями, но превью на панели по-прежнему нормально отображается. Это моя курсовая, может кто подскажет, в чем проблема? Очень надо :( У меня уже идеи кончились...
Вот код (убрал проверки):
var
g_pGraph:IGraphBuilder;
g_pCapture:ICaptureGraphBuilder2;
g_pVW:IVideoWindow;
g_pMC:IMediaControl;
g_pME:IMediaEventEx;
prw_hwnd:HWND;
pGrabber:ISampleGrabber;
pGrabberF:IBaseFilter;
function SetupVideoWindow:HRESULT;
var hr:HRESULT;
begin
hr:=g_pVW.put_WindowStyle(WS_CHILD or WS_CLIPCHILDREN);
result:= g_pVW.put_Owner(prw_hwnd);
g_pVW.SetWindowPosition(0, 0, Form1.Panel1.ClientWidth, Form1.Panel1.ClientHeight);
end;
function CaptureVideo(handle:HWND):HRESULT;
var
pSrcFilter:IBaseFilter;
pGrabberF:IBaseFilter;
mt:TAM_Media_Type;
i:integer;
begin
prw_hwnd:=handle;
hr:= GetInterfaces(); //получаем интерфейсы, тут все банально
g_pME.SetNotifyWindow(prw_hwnd, WM_APP+1, 0);
hr:=g_pCapture.SetFiltergraph(g_pGraph);
hr:=FindCaptureDevice(pSrcFilter); //тут подключаем камеру, косяк наверное не в этой функции, поэтому не стал приводить
hr:=g_pGraph.AddFilter(pSrcFilter, "Video Capture");
hr:= g_pGraph.AddFilter(pGrabberF, "Sample Grabber");
pGrabberF.QueryInterface(IID_ISampleGrabber, pGrabber);
ZeroMemory(@mt, sizeof(TAM_MEDIA_TYPE));
mt.majortype:=MEDIATYPE_Video;
mt.subtype:=MEDIASUBTYPE_RGB24;
hr:=pGrabber.SetMediaType(mt);
hr:=pGrabber.SetBufferSamples(TRUE);
// Render the preview pin on the video capture filter
hr:=g_pCapture.RenderStream (PGUID(@PIN_CATEGORY_PREVIEW), PGUID(@MEDIATYPE_Video), pSrcFilter, nil, nil);
pSrcFilter._Release();
hr:=SetupVideoWindow();
hr:= g_pMC.Run();
result:=S_OK;
end;
← →
devastator (2006-12-08 00:46) [1]Сорри, код забыл выделить.
var
g_pGraph:IGraphBuilder;
g_pCapture:ICaptureGraphBuilder2;
g_pVW:IVideoWindow;
g_pMC:IMediaControl;
g_pME:IMediaEventEx;
prw_hwnd:HWND;
pGrabber:ISampleGrabber;
pGrabberF:IBaseFilter;
function SetupVideoWindow:HRESULT;
var hr:HRESULT;
begin
hr:=g_pVW.put_WindowStyle(WS_CHILD or WS_CLIPCHILDREN);
result:= g_pVW.put_Owner(prw_hwnd);
g_pVW.SetWindowPosition(0, 0, Form1.Panel1.ClientWidth, Form1.Panel1.ClientHeight);
end;
function CaptureVideo(handle:HWND):HRESULT;
var
pSrcFilter:IBaseFilter;
pGrabberF:IBaseFilter;
mt:TAM_Media_Type;
i:integer;
begin
prw_hwnd:=handle;
hr:= GetInterfaces(); //получаем интерфейсы, тут все банально
g_pME.SetNotifyWindow(prw_hwnd, WM_APP+1, 0);
hr:=g_pCapture.SetFiltergraph(g_pGraph);
hr:=FindCaptureDevice(pSrcFilter); //тут подключаем камеру, косяк наверное не в этой функции, поэтому не стал приводить
hr:=g_pGraph.AddFilter(pSrcFilter, "Video Capture");
hr:= g_pGraph.AddFilter(pGrabberF, "Sample Grabber");
pGrabberF.QueryInterface(IID_ISampleGrabber, pGrabber);
ZeroMemory(@mt, sizeof(TAM_MEDIA_TYPE));
mt.majortype:=MEDIATYPE_Video;
mt.subtype:=MEDIASUBTYPE_RGB24;
hr:=pGrabber.SetMediaType(mt);
hr:=pGrabber.SetBufferSamples(TRUE);
// Render the preview pin on the video capture filter
hr:=g_pCapture.RenderStream (PGUID(@PIN_CATEGORY_PREVIEW), PGUID(@MEDIATYPE_Video), pSrcFilter, nil, nil);
pSrcFilter._Release();
hr:=SetupVideoWindow();
hr:= g_pMC.Run();
result:=S_OK;
end;
← →
AbrosimovA © (2006-12-08 08:41) [2]Надо посмотреть на построенный граф с помощью утилиты GraphEdit.
Она позволяет подключиться к твоему графу и посмотреть цепочку фильтров, но для этого надо добавить твой граф в таблицу ROT, используя функцию из DsPack:function AddGraphToRot(Graph: IFilterGraph; out ID: integer): HRESULT;
← →
devastator (2006-12-09 16:47) [3]Посмотрел. Почему-то на компах, на которых прога не работает, SampleGrabber не подключен к остальным фильтрам. То есть он присутствует в графе, но ни с чем не соединен. А там, где она работает - граббер находится между источником и рендерером. Как мне это исправить?
← →
AbrosimovA © (2006-12-11 08:54) [4]Нужно сравнить идентичность цепочек фильтров на разных компьютерах.
Возможно версии фильтров разные. Поварьируй mt.subtype.
← →
devastator (2006-12-11 15:31) [5]Я уже разобрался... Вручную задал источнику и грабберу одинаковые majortype и subtype, соединил их друг с другом и убрал все остальные фильтры. Мне и нужен-то был только буфер с картинкой, а превью можно и без фильтров выводить. Спасибо за пинок в правильном направлении :)
Страницы: 1 вся ветка
Текущий архив: 2007.09.16;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.083 c