DirectShow抓圖 |
尚未結案
|
炎峰
一般會員 發表:7 回覆:9 積分:3 註冊:2011-03-16 發送簡訊給我 |
不好意思,之前發的兩次網站都會出錯進不去 >"<
故在重新試一次看看 ~"~ ---------------------------------------------------------------------------- 各位大大好 :D 小弟專題會用到影像處理 目前已在 VFW 架構下完成主要功能了 礙於速度不佳,我們想要換成 DirectShow 試試看 軟體是 C Builder XE 由於小弟笨拙,DSPack 無法 compiler 成功 於是使用 XE 內建的 DirectShow (可直接 #include 使用 cppfans 逍遙遊 大大的 BcbPlayCap2010 作為範例修改 已能在 Panel 上顯示畫面 但由於要抓圖下來做處理 我們寫了下面的程式 SampleGrabber (是在已成功連接攝影機、RenderStream後呼叫的程式) 問題在於... 使用 Media Event 的 WaitForCompletion 會卡在那邊,無法往下執行 若使用 Sleep 或不等待,均會出現錯誤 0x80040227 小弟這邊希望能先抓到單圖,後續再去處理連續抓圖、callback 的問題 精簡程式碼如下: [code cpp] IVideoWindow * g_pVW; IMediaControl * g_pMC; IMediaEventEx * g_pME; IGraphBuilder * g_pGraph; ICaptureGraphBuilder2 * g_pCapture; ISampleGrabber *pGrabber; HRESULT TForm1::SampleGrabber(void) { IBaseFilter *pSG_Filter = NULL; long cbBuffer = 0; hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pSG_Filter); { return hr; hr = g_pGraph->AddFilter(pSG_Filter, L"SampleGrab"); // 將 Sample Grabber 加入 filter graph 中 { return hr; IBaseFilter *pNull = NULL; if (FAILED(hr)) Msg(TEXT("Creat NullRenderer com faild! hr=0x%x"), hr); } if (FAILED(hr)) Msg(TEXT("Add Filter - NullRenderer Error! hr=0x%x"), hr); } HDC hdc = GetDC(NULL); ReleaseDC(NULL, hdc); mt.majortype = MEDIATYPE_Video; { mt.subtype = MEDIASUBTYPE_RGB8; case 16: break; mt.subtype = MEDIASUBTYPE_RGB24; case 32: break; return E_FAIL; hr = pSG_Filter->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber); { return hr; hr = pGrabber->SetMediaType(&mt); { return hr; hr = pGrabber->SetOneShot(false); { return hr; hr = pGrabber->SetBufferSamples(true); { return hr; /* 此處為使用 ISampleGrabberCB::BufferCB CSampleGrabberCB g_StillCapCB; // 0 → SampleCB , 傳進來的位址是 Sample 原始資料 hr = g_pMC->Run(); { return hr; /* 這邊若是使用 Sleep (200~2000 都測過) 會出現錯誤 hr = 0x80040227 (VFW_E_WRONG_STATE) 則是會一直卡在這邊,不會往下執行了 //Sleep(200); hr = g_pME->WaitForCompletion( INFINITE, &EvCode ); { return hr; hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL); { return hr; if (!pBuffer) hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long*)pBuffer); { return hr; hr = pGrabber->GetConnectedMediaType(&mt); { return hr; VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)mt.pbFormat; pVih = (VIDEOINFOHEADER*)mt.pbFormat; { Msg(TEXT("Couldn't get Video Info Header!")); } if( hf == INVALID_HANDLE_VALUE ) BITMAPFILEHEADER bfh; bfh.bfType = 0x4D42; bfh.bfOffBits = sizeof(BITMAPINFOHEADER) sizeof( BITMAPFILEHEADER ); WriteFile( hf, &bfh, sizeof( bfh ), &Written, NULL ); BITMAPINFOHEADER bih; bih.biSize = sizeof( bih ); bih.biHeight = pVih->bmiHeader.biHeight; bih.biBitCount = pVih->bmiHeader.biBitCount; WriteFile( hf, &bih, sizeof( bih ), &Written, NULL ); WriteFile(hf, pBuffer, sizeof( pBuffer ), &Written, NULL); FreeMediaType(mt); SafeRelease(pGrabber); delete tmp; return S_OK; } [/code]問題就是這樣... 還請大大們指點迷津 :( 如是小弟爬文不力或是犯了低級錯誤請大大們用力鞭 ^^ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |