Почему декодер H.264 MediaFoundation не работает и выдает ошибку “CopyDecodedFrame не удалась”?

Вопрос или проблема

Почему декодер H.264 MediaFoundation не работает и выдает ошибку “CopyDecodedFrame не удалась”?

Я разрабатываю приложение, которое использует декодер H.264 от MediaFoundation. Мой код основан на этом примере.

Все, похоже, работает, пока я следую примеру и выделяю новый IMFMediaBuffer для каждого декодированного кадра. Если я пытаюсь повторно использовать один и тот же буфер для следующего кадра, декодирование завершается неудачей внутри IMFTransform::ProcessOutput с исключением “CopyDecodedFrame не удалась”.

Функция “CopyDecodedFrame” и сообщение об ошибке нигде не задокументированы. Декодер, кажется, не владеет ссылками на буферы приложения (о чем свидетельствует возвращаемое значение AddRef/Release). Хранение “использованных” буферов в пуле и повторное использование их после нескольких кадров тоже не помогает.

Ответ или решение

Ошибка "CopyDecodedFrame failed" в декодере H.264 MediaFoundation может возникать по нескольким причинам при попытке повторного использования буферов и декодирования. Вот несколько возможных причин и рекомендации для их устранения:

  1. Формат буфера: Убедитесь, что ваш буфер имеет правильный формат. MediaFoundation требует, чтобы буфер соответствовал формату, ожидаемому декодером. При повторном использовании буфера может возникать ситуация, когда старый формат буфера не совпадает с новым, что приведет к ошибке.

  2. Неправильный размер буфера: Размер буфера тоже имеет значение. Убедитесь, что выделяемый буфер имеет достаточный размер для хранения декодированной информации. В противном случае «CopyDecodedFrame» не сможет полностью скопировать данные, что приведет к сбою.

  3. Состояние декодера: Когда вы передаете уже использованный буфер декодеру, убедитесь, что декодер полностью освободил все ссылки на предыдущий буфер. Может оказаться, что декодер все еще ожидает завершения операций с предыдущим буфером, и поэтому повторное использование может привести к ошибкам.

  4. Корректная синхронизация: Если вы используете многопоточные конструкции, убедитесь, что доступ к буферу осуществляется корректно, и нет состояния гонки, которое может влиять на работу декодера.

  5. Правильное управление жизненным циклом: Убедитесь, что вы правильно управляете жизненным циклом объектов IMFMediaBuffer. Каждый раз, когда вы создаете новый буфер или используете существующий, следите за вызовами AddRef и Release, чтобы избежать утечек памяти и гарантировать, что буфер остается доступным в течение всей нужной вам логики выполнения.

  6. Логи и отладка: Включите отладочные сообщения для вашей реализации, чтобы отслеживать, какие именно вызовы приводят к ошибке, и в какой момент управления идет сбой. Это может помочь выявить корень проблемы.

Если все вышеупомянутое не помогает, возможно, стоит рассмотреть возможность обращения в поддержку Microsoft для уточнения поведения конкретной реализации декодера H.264 в MediaFoundation, так как данная функция может иметь свои особенности, не освещенные в официальной документации.

В целом, для надлежащей работы с декодером H.264 в MediaFoundation рекомендуется избегать повторного использования буферов без надлежащей проверки их состояния и формата, если это возможно. Выделение нового буфера для каждого декодированного кадра является более безопасным подходом и может предотвратить возникновение таких ошибок.

Оцените материал
Добавить комментарий

Капча загружается...