Главная страница
    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.46 MB
Время: 0.083 c
2-1187867001
Daedr
2007-08-23 15:03
2007.09.16
Цикл


2-1187571706
Abcdef123
2007-08-20 05:01
2007.09.16
Чем можно заменить свойство Enabled?


2-1187987876
TPel
2007-08-25 00:37
2007.09.16
Антивирусник учебный


15-1187676722
AZIZE
2007-08-21 10:12
2007.09.16
И что из этого выйдет


1-1184003393
fd00ch
2007-07-09 21:49
2007.09.16
Эмуляция стандартного меню





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский