Событие
MESessionClosed
создается в результате завершения асинхронно выполненного вызова IMFMediaSession::Close
. Если вы не получили сообщение, это указывает на проблему с закрытием, возможно, на проблему с одним из примитивов, участвующих в топологии, такую как, например, невозможность завершить потоковую передачу из-за невыполненной или утечки ссылки на некоторый объект.
Учитывая описание проблемы, возможно, лучший способ решить эту проблему - подключить отладчик к процессу (в реальном времени или создать дамп и просмотреть его в интерактивном режиме), ожидая найти поток, ожидающий что-то для закрытия или завершения.
Если вы видели MF_E_SAMPLEALLOCATOR_EMPTY
ранее, это может указывать на то, что утечка указателя на один из образцов препятствует завершению распределителя выборок внутри одного из примитивов, что, в свою очередь, создает тупик.
Кроме этого, вы можете захотеть выполнить mftrace для процесса и сравнить выходные данные, полученные в результате закрытого сеанса, с другим, который завершился неудачей.
Еще одна вещь, которая вас также интересует, в том числе вопрос, касающийся вопроса, - это понимание топологии и, особенно, наличие у нее сторонних или дополнительных сегментов, которые вы можете временно исключить. Так как вы не можете выполнять большую часть отладки внутренних компонентов MF напрямую, ваши варианты изменения топологии могут помочь вам сузить суть проблемы до конкретного примитива, который доставляет вам проблемы. Если в топологии есть свои собственные примитивы, вы заинтересованы в проверке их поведения при завершении.