Многократный ввод MFT в Microsoft Media Foundation
Я борюсь с микшированием двух аудиопотоков в один выходной поток. MFNode имеет AudioMixerMFT, но TopoEdit падает, когда я пытаюсь построить топологию, подобную этой, и выполнить ее:
Примечание: я попробовал TopoEdit, который поставляется с Windows SDK 7.1, а также с несколькими исправлениями автора "Разработка приложений Microsoft® Media Foundation"
Я подумал, что это может быть какой-то проблемой с TopoEdit, поэтому я построил топологию в коде (изменив код из гл. 9 "Разработка приложений Microsoft® Media Foundation"), но все равно не получилось с "E_UNEXPECTED Catastrophic fail" на mediaEvent->GetStatus(&hrStatus)
внутри HRESULT CPlayer::ProcessEvent(CComPtr<IMFMediaEvent>& mediaEvent)
на событие начала сеанса.
Теперь я подумал, что это может быть какой-то проблемой с AudioMixerMFT, поэтому я написал пользовательский MFT с 2 входами, который действует как простой сквозной канал (отправляет только 1-й вход и игнорирует 2-й). И я построил топологию в TopoEdit, и это сработало:
Но когда я подключил Audio 2.wav к MFT, он упал. Теперь я попытался использовать этот пользовательский MFT в своем собственном коде, и он снова работал с одним входом, но потерпел неудачу с "E_UNEXPECTED Catastrophic fail" при применении двух входов.
Не зная, в чем может быть проблема, я начал сомневаться в том, что поддерживается множественный ввод MFT, я наткнулся на пост http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/21596e11-c4e2-480a-b28f-9e2f5fa8820d/mutlinput-and-multioutput (да, он довольно старый), который говорит, что он не поддерживается.
Есть ли кто-нибудь, кто смог успешно запустить AudioMixerMFT из MFNode? Есть ли альтернатива Microsoft Media Foundation? или Любая подсказка будет оценена. Спасибо
1 ответ
MFNode - это мой проект с открытым исходным кодом.
Если вы прочитаете документацию MFNode, вы увидите, что TopoEdit не обрабатывает более одного входного потока в MFT. И да TopoEdit вылетает. Вы можете исправить ошибку в исходном коде TopoEdit. Это просто нулевой указатель, который TopoEdit не проверял. Но, к сожалению, это не решает проблему. TopoEdit не может дважды вызвать ProcessInput для двух входных потоков перед вызовом ProcessOutput.
Вы должны предоставить пользовательский мультимедийный сеанс, чтобы он работал (реализовать IMFMediaSession).
В следующем обновлении MFNode Project я предоставлю проигрыватель для использования всего MFNode, и особенно MFNode Audio Mixer.
РЕДАКТИРОВАТЬ: в tededit.cpp TopoEdit падает в CTedEditorVisualObjectEventHandler:: NotifyObjectDeleted:
... CTedTopologyNode * pNode = m_pEditor-> FindNode (pConn-> GetOutputNodeID ());...
pNode может иметь нулевой указатель, а TopoEdit не проверяет.
РЕДАКТИРОВАТЬ
Я обновил свой проект. Проверьте MFNodePlayer. Я использую пользовательский MediaSession для обработки топологии волнового микшера.
Это работает хорошо, но это не идеально из-за двух вещей. Если вы остановите топологию, а затем воспроизведете ее, произойдет сбой (потому что я должен остановить весь источник и, возможно, сбросить время и поток байтов). Во-вторых, есть функция, которая обрабатывает IMFTransform рекурсивным способом. Сложно отлаживать.
Я исправлю позже.
PS: Отдельное спасибо книге "Разработка приложений Microsoft Media Foundation". Это очень помогает мне в создании собственной MediaSession.