c++ - Microsoft Media Foundation 中的多输入 MFT

标签 c++ ms-media-foundation

我正在努力将两个音频流混合成单个输出流。 MFNode 有一个 AudioMixerMFT,但当我尝试构建这样的拓扑并执行它时,TopoEdit 崩溃了:

enter image description here

注意:我尝试了 Windows SDK 7.1 附带的 TopoEdit,也是“开发 Microsoft® Media Foundation 应用程序”一书的作者进行了一些修复的版本

我认为这可能是 TopoEdit 的问题,因此我在代码中构建了拓扑(通过修改“开发 Microsoft® Media Foundation 应用程序”的 Ch#9 中的代码),但它仍然失败,并在 mediaEvent->GetStatus(&hrStatus) 上出现“E_UNEXPECTED 灾难性故障” session 开始事件的 HRESULT CPlayer::ProcessEvent(CComPtr<IMFMediaEvent>& mediaEvent) 内。

现在,我认为这可能是 AudioMixerMFT 的问题,因此我编写了一个具有 2 个输入的自定义 MFT,其作用类似于简单的传递(仅发送第一个输入并忽略第二个输入)。我在 TopoEdit 中构建了一个拓扑,效果如下:

enter image description here

但是当我将“Audio 2.wav”连接到 MFT 时,它崩溃了。现在,我尝试在自己的代码中使用此自定义 MFT,它在单个输入下再次工作,但在应用两个输入时失败,并出现“E_UNEXPECTED 灾难性故障”。

不确定可能是什么问题,我开始怀疑是否支持多输入 MFT,我遇到了一个帖子 http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/21596e11-c4e2-480a-b28f-9e2f5fa8820d/mutlinput-and-multioutput(是的,它很旧),说它不受支持。

有人能够从 MFNode 成功运行 AudioMixerMFT 吗?有 Microsoft Media Foundation 的替代品吗?或任何提示将不胜感激。谢谢

最佳答案

MFNode 是我的开源项目。

如果您阅读 MFNode 的文档,您会发现 TopoEdit 在 MFT 中不能处理多个输入流。是的,TopoEdit 崩溃了。您可以修复 TopoEdit 源代码中的错误。它只是一个 TopoEdit 不检查的空指针。但不幸的是,它并不能解决问题。在调用 ProcessOutput 之前,TopoEdit 无法在两个输入流上调用 ProcessInput 两次。

您必须提供自定义媒体 session 才能使其正常工作(实现 IMFMediaSession)。

在 MFNode 项目的下一次更新中,我将提供一个播放器来使用所有 MFNode,特别是 MFNode 音频混合器。

编辑:在 tededit.cpp 中,TopoEdit 在 CTedEditorVisualObjectEventHandler::NotifyObjectDeleted 处崩溃:

... CTedTopologyNode* pNode = m_pEditor->FindNode(pConn->GetOutputNodeID()); ...

pNode 可以为空指针,TopoEdit 不会检查。

编辑

我已经更新了我的项目。检查 MFNodePlayer。我使用自定义 MediaSession 来处理波形混合器拓扑。

它运行良好,但由于两件事而不完美。如果您停止拓扑然后重播,它将失败(因为我必须停止所有源,并且可能重置时钟和字节流)。其次,有一个函数以递归方式处理 IMFTransform。调试起来很困难。

我稍后会修复。

PS:特别感谢《开发微软媒体基础应用程序》一书。它对我创建自定义 MediaSession 有很大帮助。

关于c++ - Microsoft Media Foundation 中的多输入 MFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18825357/

相关文章:

windows - 在 Media Foundation 中使用 COINIT_APARTMENTTHREADED 或 COINIT_MULTITHREADED?

c++ - mediafoundation 能否允许多个客户端同时访问单个网络摄像头设备?

audio - 将USB网络摄像头和USB扬声器组合到Windows中的单个虚拟音频设备中

c++ - C++11 中是否有一个模板来推断将值传递给函数时要使用的最佳类型?

c++ - 将 Base1 指针转换为 Base2 指针(boost shared_ptr)

c++ - 未声明的标识符,超出范围? (使用 C++ 列表)

支持三值逻辑的 C++ 库 : 0, 1,X

winapi - 媒体基金会捕获反转图像

windows - 如何让自定义视频媒体/流接收器在媒体基础中请求 RGB32 帧?

java - 在 Java 中返回一个全局对象