Вопрос или проблема
Почему декодер H.264 MediaFoundation не работает и выдает ошибку “CopyDecodedFrame не удалась”?
Я разрабатываю приложение, которое использует декодер H.264 от MediaFoundation. Мой код основан на этом примере.
Все, похоже, работает, пока я следую примеру и выделяю новый IMFMediaBuffer для каждого декодированного кадра. Если я пытаюсь повторно использовать один и тот же буфер для следующего кадра, декодирование завершается неудачей внутри IMFTransform::ProcessOutput
с исключением “CopyDecodedFrame не удалась”.
Функция “CopyDecodedFrame” и сообщение об ошибке нигде не задокументированы. Декодер, кажется, не владеет ссылками на буферы приложения (о чем свидетельствует возвращаемое значение AddRef/Release). Хранение “использованных” буферов в пуле и повторное использование их после нескольких кадров тоже не помогает.
Ответ или решение
Ошибка "CopyDecodedFrame failed" в декодере H.264 MediaFoundation может возникать по нескольким причинам при попытке повторного использования буферов и декодирования. Вот несколько возможных причин и рекомендации для их устранения:
-
Формат буфера: Убедитесь, что ваш буфер имеет правильный формат. MediaFoundation требует, чтобы буфер соответствовал формату, ожидаемому декодером. При повторном использовании буфера может возникать ситуация, когда старый формат буфера не совпадает с новым, что приведет к ошибке.
-
Неправильный размер буфера: Размер буфера тоже имеет значение. Убедитесь, что выделяемый буфер имеет достаточный размер для хранения декодированной информации. В противном случае «CopyDecodedFrame» не сможет полностью скопировать данные, что приведет к сбою.
-
Состояние декодера: Когда вы передаете уже использованный буфер декодеру, убедитесь, что декодер полностью освободил все ссылки на предыдущий буфер. Может оказаться, что декодер все еще ожидает завершения операций с предыдущим буфером, и поэтому повторное использование может привести к ошибкам.
-
Корректная синхронизация: Если вы используете многопоточные конструкции, убедитесь, что доступ к буферу осуществляется корректно, и нет состояния гонки, которое может влиять на работу декодера.
-
Правильное управление жизненным циклом: Убедитесь, что вы правильно управляете жизненным циклом объектов
IMFMediaBuffer
. Каждый раз, когда вы создаете новый буфер или используете существующий, следите за вызовамиAddRef
иRelease
, чтобы избежать утечек памяти и гарантировать, что буфер остается доступным в течение всей нужной вам логики выполнения. - Логи и отладка: Включите отладочные сообщения для вашей реализации, чтобы отслеживать, какие именно вызовы приводят к ошибке, и в какой момент управления идет сбой. Это может помочь выявить корень проблемы.
Если все вышеупомянутое не помогает, возможно, стоит рассмотреть возможность обращения в поддержку Microsoft для уточнения поведения конкретной реализации декодера H.264 в MediaFoundation, так как данная функция может иметь свои особенности, не освещенные в официальной документации.
В целом, для надлежащей работы с декодером H.264 в MediaFoundation рекомендуется избегать повторного использования буферов без надлежащей проверки их состояния и формата, если это возможно. Выделение нового буфера для каждого декодированного кадра является более безопасным подходом и может предотвратить возникновение таких ошибок.