Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.268 c
15-1187298274
Petr V. Abramov
2007-08-17 01:04
2007.09.16
дайте урок англицкого


15-1187331871
Gydvin
2007-08-17 10:24
2007.09.16
Flatron F920B туфтовый монитор?


3-1179292836
Цукор5
2007-05-16 09:20
2007.09.16
DBF потоках + "упаковка"


4-1174766392
Дмитрий Белькевич
2007-03-24 22:59
2007.09.16
Как зазипоповать файл win xp api?


2-1187873730
Алла_И
2007-08-23 16:55
2007.09.16
Копирование через Pointer





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский