IMFStreamSink::ProcessSample 未调用——自定义媒体接收器

问题描述

我编写了一个自定义媒体接收器(用于控制硬件视频输出板)。在一年的大部分时间里,这一直在按预期工作。当我重新编译接收器时,事情停止了。我注意到媒体基础库和 dll 在重新编译前几周更新。 MFTrace 显示拓扑具有在预期拓扑中连接的预期块。 MediaTypes 也是正确的。当演示时钟启动时,我发送一个 MEStreamSinkStarted 事件,然后是一个 MEStreamSinkRequestSample 事件。正在读取这两个事件,但从未调用 ProcessSample。视频文件正在播放;音频流正常处理。我可以通过 TopoEdit 将视频文件成功播放到 EVR。问题是在重新编译之后而不是在 Windows 更新之后发生的,这表明(对我而言)某种接口更改——现在可能需要一个以前的可选功能——但我没有找到任何对更改的引用。我几乎没有想法了。

这是对示例请求进行排队的函数

HRESULT Bmdstream::OnStarted(void)
{

    OutputDebugString(_T("Bmdstream::OnStarted()"));
    FAIL_RETURN(QueueEvent(MEStreamSinkStarted,GUID_NULL,S_OK,NULL));
    OutputDebugString(_T("Bmdstream  -- Requesting sample"));
    FAIL_RETURN(QueueEvent(MEStreamSinkRequestSample,NULL));

    return (S_OK);
}
'''

解决方法

我的过错(一如既往)。在重新编译sink的同时,我又做了一个我也怀疑的改动,但是检查了3次都没有发现bug。我无意中将源实例化了两次。一个实例用于音频,另一个用于视频。显然视频源从未启动。与接收器、Windows 更新或除我之外的任何内容无关。啊!