gpt4 book ai didi

c++ - iSampleGrabber,回调方法。代码有效,但可能需要一些爱?

转载 作者:行者123 更新时间:2023-11-28 07:37:12 27 4
gpt4 key购买 nike

好的。所以我已经让我的 isamplegrabber 回调方法起作用,并且我能够将数据导入 opencv。但由于这对我来说是全新的,如果代码“正确”,我只想得到一些反馈,因为它似乎不是一个好代码..

首先在我的代码中(来自互联网)我有:

#pragma region Formerly located in qedit.h in Windows SDK, now obsoleted and defined within project

void createDirectShowGraph(void);
struct __declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85"))
ISampleGrabberCB : IUnknown
{
//
// Raw methods provided by interface
//

virtual HRESULT __stdcall SampleCB (double SampleTime, struct IMediaSample * pSample ) = 0;
virtual HRESULT __stdcall BufferCB (double SampleTime, unsigned char * pBuffer, long BufferLen ) = 0;
};
static const IID IID_ISampleGrabberCB = { 0x0579154A, 0x2B53, 0x4994, { 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85 } };
struct __declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f"))
ISampleGrabber : IUnknown
{
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall SetOneShot (long OneShot ) = 0;
virtual HRESULT __stdcall SetMediaType (struct _AMMediaType * pType ) = 0;
virtual HRESULT __stdcall GetConnectedMediaType (struct _AMMediaType * pType ) = 0;
virtual HRESULT __stdcall SetBufferSamples (long BufferThem ) = 0;
virtual HRESULT __stdcall GetCurrentBuffer (/*[in,out]*/ long * pBufferSize,
/*[out]*/ long * pBuffer ) = 0;
virtual HRESULT __stdcall GetCurrentSample (/*[out,retval]*/ struct IMediaSample * * ppSample ) = 0;
virtual HRESULT __stdcall SetCallback (struct ISampleGrabberCB * pCallback,long WhichMethodToCallback ) = 0;
};

struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37"))
SampleGrabber;
// [ default ] interface ISampleGrabber

#pragma endregion

后来,在互联网的帮助下,我插入了这个:

class CFakeCallback : public ISampleGrabberCB 
{
public:
//some variables and stuff...
STDMETHODIMP_(ULONG) AddRef() { return 2; }
STDMETHODIMP_(ULONG) Release() { return 1; }

STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
{
//CheckPointer(ppv, E_POINTER);

if (riid == IID_ISampleGrabberCB || riid == IID_IUnknown)
{
*ppv = (void *) static_cast<ISampleGrabberCB *>(this);
return NOERROR;
}
return E_NOINTERFACE;
}

STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )
{
//The data for grabbing the frames.
}

STDMETHODIMP BufferCB( double SampleTime, BYTE * pBuffer, long BufferLen )
{

return 0;
}

};


CFakeCallback callbackF;

我使用:

pSampleGrabber->SetCallback(&callbackF,0);

一切正常,但我想知道。我需要为回调方法创建一个新类吗?我可以在“#pragma region...”中看到所有方法,难道我不能将这些方法用于回调吗?

问题:

一:我是否需要为 sampleCB/bufferCB 方法设置“fakeCallback”类?或者我能否以某种方式使用第一个代码部分中的方法?

二: “virtual”——方法,意味着这个方法可以被“覆盖”?这就是我在使用方法 sampleCB 和 bufferCB 创建类 fakeCallback 时所做的吗?

谢谢!

最佳答案

如果您只想使用回调从过滤器图中抓取一帧,那么您需要实现 ISampleGrabberCB 接口(interface)。您已经实现了使用 ISampleGrabberCB 接口(interface)所必需的 CFakeCallback。您可以使用 BufferCB 或 SampleCB 获取样本。因此,当您实现 CFakeCallback 时,您将需要覆盖 SampleCB 和 BufferCB。其中一个将包含您自定义代码以获取样本,而另一个将仅返回 S_OK (0)。在您的代码中,您使用的是正确的 SampleCB。

但是,如果您不想使用回调方法,那么 SampleGrabber 已经存在于 Windows SDK 中。您只需要在您的应用程序中包含 qedit.h 即可。

关于c++ - iSampleGrabber,回调方法。代码有效,但可能需要一些爱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16562479/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com