Я борюсь с микшированием двух аудиопотоков в один выходной поток. 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-й вход & игнорирует второй). И я построил топологию в 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? или Любая подсказка будет оценена. Спасибо
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.
Других решений пока нет …