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

2

Решение

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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]