IMFSourceReader.ReadSample 在读取流 1 后从不触发回调。对流 0 的调用工作正常

Posted

技术标签:

【中文标题】IMFSourceReader.ReadSample 在读取流 1 后从不触发回调。对流 0 的调用工作正常【英文标题】:IMFSourceReader.ReadSample never hitting callback after reading on stream 1. calls to stream 0 work fine 【发布时间】:2020-06-24 15:33:29 【问题描述】:

所以背景我正在修改一个使用直接显示以使用 Windows Media Foundation 的应用程序。在 Directshow 中,我的 UVC 相机仍然可以正常工作。但是,当我切换到在 WMF 中使用 SourceReader 时,我有流 0(实时视频流)但是当我使用相同的接口尝试在 Stream1 上请求样本时,我没有收到任何东西。这是通过以下调用。

hr = StreamReader.ReadSample(1,
                            MediaFoundation.ReadWrite.MF_SOURCE_READER_CONTROL_FLAG.None,
                            IntPtr.Zero,
                            IntPtr.Zero,
                            IntPtr.Zero,
                            IntPtr.Zero
                            );

如果我切换到

hr = StreamReader.ReadSample(1,
                        MediaFoundation.ReadWrite.MF_SOURCE_READER_CONTROL_FLAG.Drain,
                        IntPtr.Zero,
                        IntPtr.Zero,
                        IntPtr.Zero,
                        IntPtr.Zero
                        );

我只收到空的 IMFSamples。我检查了 hr 的状态,它总是 S_OK。在此期间,我也在运行相同的呼叫,但在流 0 上运行良好。我得到的唯一错误或标志是流 0 上第一帧上的 StreamTick。

如果有人提出建议,我不完全确定从这里去哪里

编辑1: 我确实为两者选择了流,并且使用 SetCurrentMediaType 设置了所需的 MediaType

【问题讨论】:

也许您也有流 2,它对应于 DirectShow 中的引脚 1(并且可以按预期工作)。 @reply Roman R. 当我检查时,设备上只有 2 个流可用,所以它应该仍然是流 1。 我认为除了确保选择流的媒体类型之外,您不需要做任何事情。我会说最可能的原因是驱动程序故障。 DirectShow 引脚的操作是重要的观察结果,但它并不能证明该设备完全有效并且与 MF 兼容。 【参考方案1】:

IMFSourceReader::SetStreamSelection 方法可以配置阅读器并将其设置为期望或不期望特定流上的样本。您需要确保在读取之前选择了流。

【讨论】:

我选择了流 1 和 0。当它被取消选择时,我仍然在 onreadsample 回调中遇到错误(我相信它是无效的请求)

以上是关于IMFSourceReader.ReadSample 在读取流 1 后从不触发回调。对流 0 的调用工作正常的主要内容,如果未能解决你的问题,请参考以下文章