网站推广.NET

网站推广.NET

关于使用ISampleGrabberCB接口获取帧数据问题

来源:互联网

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”(不带引号),然后按回车键执行,完成后重启计算机。
isamplegrabbercb