Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.024 c
15-1187600182
@!!ex
2007-08-20 12:56
2007.09.16
ИНтересно, мне будет втык...


2-1187710522
Sonic90
2007-08-21 19:35
2007.09.16
Целое число


15-1187471647
timself
2007-08-19 01:14
2007.09.16
Помогите подобрать компонент… RTF-->HTML


2-1187794230
mfender
2007-08-22 18:50
2007.09.16
TIdIMAP и полное непонимание процесса.... ((((


15-1185456859
asafr
2007-07-26 17:34
2007.09.16
Model-View-Controller