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