我正在努力将两个音频流混合成单个输出流。 MFNode 有一个 AudioMixerMFT,但当我尝试构建这样的拓扑并执行它时,TopoEdit 崩溃了:
注意:我尝试了 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 中构建了一个拓扑,效果如下:
但是当我将“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/