ISampleGrabberCB接口是DirectShow中用于获取帧数据的回调接口,可以自定义实现该接口并传递给ISampleGrabber接口,来获取视频帧的数据。下面是使用ISampleGrabberCB接口获取帧数据的一般步骤: 1. 创建ISampleGrabber对象。 2. 创建ISampleGrabberCB对象。 3. 将ISampleGrabberCB对象赋值给ISampleGrabber::SetCallback方法。 4. 启动ISampleGrabber对象。 5. 循环读取帧数据。
ISampleGrabberCB接口简介
ISampleGrabberCB接口是DirectShow库中的一个回调接口,用于在获取视频帧数据时进行自定义处理,通过实现ISampleGrabberCB接口,我们可以在获取到视频帧数据后,对其进行预处理、后处理等操作,从而满足特定的需求。
如何使用ISampleGrabberCB接口
1、创建IBaseFilter对象
要使用ISampleGrabberCB接口,首先需要创建一个IBaseFilter对象,然后将其作为参数传递给CreateStreamSampleGrabber方法,以创建一个ISampleGrabber对象。
2、实现ISampleGrabberCB接口
接下来,需要实现ISampleGrabberCB接口,并重写其中的几个虚拟函数:
QueryInterface:用于处理其他接口的请求;
AddRef:增加引用计数;
Release:减少引用计数;
NewSample:当有新的视频帧数据可用时调用此函数。
3、设置回调函数
在创建ISampleGrabber对象后,还需要设置其回调函数,这可以通过ISampleGrabber::SetCallback方法来实现,该方法接受一个指向ISampleGrabberCB接口实例的指针作为参数。
4、开始获取帧数据
调用IMediaControl::Run方法启动媒体流,开始获取帧数据,在NewSample回调函数中,可以对获取到的视频帧数据进行处理。
示例代码
include <dshow.h>include <iostream>include <string>include <vector>include "samplegrabbercb.h"int main(){ CoInitialize(NULL); // 创建系统设备枚举器 ICreateDevEnum *pDevEnum = NULL; if (FAILED(CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum)))) { std::cerr << "创建设备枚举器失败!" << std::endl; return -1; } // 获取视频输入设备类别过滤器 IEnumMoniker *pEnum = NULL; pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0); // 遍历视频输入设备 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 << "找到视频输入设备: " << V_BSTR(&var) << std::endl; pPropBag->Release(); } VariantClear(&var); } pMoniker->Release(); } pEnum->Release(); pDevEnum->Release(); // TODO: 根据找到的视频输入设备名称进行筛选和配置,创建IBaseFilter对象并设置回调函数等操作。 // ...省略部分代码... CoUninitialize(); return 0;}```四、相关问题与解答1、如何解决“无法连接到DMO”的问题?答:这个问题通常是由于DMO(数字媒体对象)组件未注册或注册失败导致的,可以尝试重新注册DMO组件,或者检查系统中是否存在已损坏的DMO组件,具体操作如下:打开“运行”对话框(快捷键Win+R),输入“regsvr32 %systemroot%system32strmiids.dll”(不带引号),然后按回车键执行,完成后重启计算机。