C++ 未在自定义媒体接收器上调用IMFStreamSink::ProcessSample()

C++ 未在自定义媒体接收器上调用IMFStreamSink::ProcessSample(),c++,uwp,ms-media-foundation,C++,Uwp,Ms Media Foundation,我试图实现一个自定义的Windows媒体基础媒体接收器,用于在UWP应用程序中使用,它将通过 MediaPACTIO::PravaReLabReLogOutuStudioKasyCy.()< < /> > 但是,我目前遇到一个问题,即从未调用我的IMFStreamSink的ProcessSample()函数,即使我在我的IMFMediaSink::OnClockStart()中将事件排队 我遵循了这里的文档()并查看了“简单通信”示例 这是我得到的输出,我记录了我的接收器执行的每个函数调用和每

我试图实现一个自定义的Windows媒体基础媒体接收器,用于在UWP应用程序中使用,它将通过<代码> MediaPACTIO::PravaReLabReLogOutuStudioKasyCy.()< < /> >

但是,我目前遇到一个问题,即从未调用我的
IMFStreamSink
ProcessSample()
函数,即使我在我的
IMFMediaSink::OnClockStart()
中将事件排队

我遵循了这里的文档()并查看了“简单通信”示例

这是我得到的输出,我记录了我的接收器执行的每个函数调用和每个调用的HRESULT:

MyCaptureMediaSink::SetPresentationClock        
OK: Clock->AddClockStateSink(this)
MyCaptureStreamSink::BeginGetEvent        
OK: MediaEventQueue->BeginGetEvent(pCallback, punkState)
MyCaptureMediaSink::OnClockStart        
MyCaptureStreamSink::QueueEvent        
OK: MediaEventQueue->QueueEventParamVar(met, guidExtendedType, hrStatus, pvValue)
OK: Sink->QueueEvent(MEStreamSinkStarted, GUID_NULL, S_OK, nullptr)
MyCaptureStreamSink::QueueEvent        
OK: MediaEventQueue->QueueEventParamVar(met, guidExtendedType, hrStatus, pvValue)
OK: Sink->QueueEvent(MEStreamSinkRequestSample, GUID_NULL, S_OK, nullptr)
在最后一行之后,我想我应该看到的是由于接收到
MEStreamSinkStarted
而调用
MyCaptureStreamSink::EndGetEvent()
,然后是另一个
BeginGetEvent()
EndGetEvent()
对和一个调用
ProcessSample()
因为下一个事件将是
MEStreamSinkRequestSample
事件


我是否缺少了一些我仍然需要调用的函数,以便MediaCapture系统调用这些函数?

我找到了解决问题的方法: 我在没有使用
winrt::implements
的情况下重新实现了我的流接收器,它似乎按预期工作。我假设(尽管我仍然不是100%确定)正在发生的是,由于
IMFStreamSink
派生自
IMFMediaGenerator
,因此
winrt::implemnets
不会为基类型正确生成
QueryInterface
。在我自己的实现中,我需要显式地处理它

这是旧的类声明,不起作用:

class MyStreamSink : public winrt::implements<MyStreamSink, IMFStreamSink>
{
    // ...
};
类MyStreamSink:public winrt::implements
{
// ...
};
这是一门有效的课程:

class MyStreamSink: public IMFStreamSink
{
    virtual HRESULT QueryInterface(const IID& riid, void** ppvObject) override
    {
        if (riid == __uuidof(IMFMediaEventGenerator))
        {
            *ppvObject = static_cast<IMFMediaEventGenerator*>(this);
        }
        //...
    }
}
classmystreamsink:public IMFStreamSink
{
虚拟HRESULT查询接口(常量IID和riid,无效**ppvObject)覆盖
{
如果(riid==u uuidof(IMFMediaEventGenerator))
{
*ppvObject=静态投影(此);
}
//...
}
}

更好的方法是重写的winrt::is\u guid\u。通过这种方法,您可以得到一个共享的v形表,而不是两个单独的v形表。有关更多信息:

模板
内联bool winrt::是(guid const&id)noexcept的\u guid\u吗
{
返回winrt::是(id)的\u guid\u;
}
类MyStreamSink:public winrt::implements
{
//...
};

它可以是
公共winrt::implements
template<>
inline bool winrt::is_guid_of<IMFStreamSink>(guid const& id) noexcept
{
    return winrt::is_guid_of<IMFStreamSink, IMFMediaEventGenerator>(id);
}

class MyStreamSink : public winrt::implements<MyStreamSink, IMFStreamSink>
{
    //...
};