新聞中心
ISampleGrabberCB接口簡介
ISampleGrabberCB接口是DirectShow庫中的一個回調(diào)接口,用于在獲取視頻幀數(shù)據(jù)時進行自定義處理,通過實現(xiàn)ISampleGrabberCB接口,我們可以在獲取到視頻幀數(shù)據(jù)后,對其進行預(yù)處理、后處理等操作,從而滿足特定的需求。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),江北企業(yè)網(wǎng)站建設(shè),江北品牌網(wǎng)站建設(shè),網(wǎng)站定制,江北網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,江北網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
如何使用ISampleGrabberCB接口
1、創(chuàng)建IBaseFilter對象
要使用ISampleGrabberCB接口,首先需要創(chuàng)建一個IBaseFilter對象,然后將其作為參數(shù)傳遞給CreateStreamSampleGrabber方法,以創(chuàng)建一個ISampleGrabber對象。
2、實現(xiàn)ISampleGrabberCB接口
接下來,需要實現(xiàn)ISampleGrabberCB接口,并重寫其中的幾個虛擬函數(shù):
QueryInterface:用于處理其他接口的請求;
AddRef:增加引用計數(shù);
Release:減少引用計數(shù);
NewSample:當(dāng)有新的視頻幀數(shù)據(jù)可用時調(diào)用此函數(shù)。
3、設(shè)置回調(diào)函數(shù)
在創(chuàng)建ISampleGrabber對象后,還需要設(shè)置其回調(diào)函數(shù),這可以通過ISampleGrabber::SetCallback方法來實現(xiàn),該方法接受一個指向ISampleGrabberCB接口實例的指針作為參數(shù)。
4、開始獲取幀數(shù)據(jù)
調(diào)用IMediaControl::Run方法啟動媒體流,開始獲取幀數(shù)據(jù),在NewSample回調(diào)函數(shù)中,可以對獲取到的視頻幀數(shù)據(jù)進行處理。
示例代碼
includeinclude include include include "samplegrabbercb.h" int main() { CoInitialize(NULL); // 創(chuàng)建系統(tǒng)設(shè)備枚舉器 ICreateDevEnum *pDevEnum = NULL; if (FAILED(CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum)))) { std::cerr << "創(chuàng)建設(shè)備枚舉器失敗!" << std::endl; return -1; } // 獲取視頻輸入設(shè)備類別過濾器 IEnumMoniker *pEnum = NULL; pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0); // 遍歷視頻輸入設(shè)備 IMoniker *pMoniker = NULL; while (pEnum->Next(1, &pMoniker, NULL) == S_OK) { IPropertyBag *pPropBag; HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag)); if (SUCCEEDED(hr)) { VARIANT var; VariantInit(&var); hr = pPropBag->Read(L"FriendlyName", &var, 0); if (SUCCEEDED(hr)) { std::wcout << "找到視頻輸入設(shè)備: " << V_BSTR(&var) << std::endl; pPropBag->Release(); } VariantClear(&var); } pMoniker->Release(); } pEnum->Release(); pDevEnum->Release(); // TODO: 根據(jù)找到的視頻輸入設(shè)備名稱進行篩選和配置,創(chuàng)建IBaseFilter對象并設(shè)置回調(diào)函數(shù)等操作。 // ...省略部分代碼... CoUninitialize(); return 0; }``` 四、相關(guān)問題與解答 1、如何解決“無法連接到DMO”的問題? 答:這個問題通常是由于DMO(數(shù)字媒體對象)組件未注冊或注冊失敗導(dǎo)致的,可以嘗試重新注冊DMO組件,或者檢查系統(tǒng)中是否存在已損壞的DMO組件,具體操作如下:打開“運行”對話框(快捷鍵Win+R),輸入“regsvr32 %systemroot%system32strmiids.dll”(不帶引號),然后按回車鍵執(zhí)行,完成后重啟計算機。
文章名稱:關(guān)于使用ISampleGrabberCB接口獲取幀數(shù)據(jù)問題
當(dāng)前URL:http://www.dlmjj.cn/article/cdejihe.html


咨詢
建站咨詢
