MediaFoundation 在预览时捕获视频

问题描述

This 说:

在 Media Foundation 中,捕获设备由媒体源对象表示,该对象公开 IMFMediaSource 接口。在大多数情况下,应用程序不会直接使用该接口,而是会使用更高级别的 API(例如 Source Reader)来控制捕获设备。

我有 IMFMediaSource 时,我可以使用 MFCreateSourceReaderFromMediaSource 并创建源阅读器。但是,当我还预览要捕获的视频时,此函数会因 MF_E_MULTIPLE_SUBSCRIBERS 而失败,这正是我想要的。

hr = MFCreateSourceReaderFromMediaSource(t.source,&t.rdr); // Fails if I'm previewing,suceeeds when I'm not.

有没有办法获取 SourceReader 来捕获我已经预览的视频?

我正在使用 Media Session 进行预览。

或者,如果这是不可能的,我如何在没有源阅读器的情况下直接使用 IMFMediaSource?与嵌入式相机应用程序的功能非常相似。

非常感谢。

解决方法

MF_E_MULTIPLE_SUBSCRIBERS 部分被触及 by another question:您不能让媒体会话管理源,否则另外使用它。

如果两者都需要,则需要在该媒体会话中使用发球台并使用发球台的两条腿进行预览和捕获。

或者,您自己管理源并在媒体会话中使用自定义开发的代理来接受来自源的数据。

或者,如果这是不可能的,我如何在没有源阅读器的情况下直接使用 IMFMediaSource?与嵌入式相机应用程序的功能非常相似。

或者干脆去掉Media Session,直接从媒体源读取数据,使用Media Foundation之外的数据。

使用模式相当简单(并重复媒体会话或源阅读器将代表您执行的操作):创建演示文稿描述符、设置它、订阅事件、启动、接收样本。此 API 是 fully documented