Я использую API NDK MediaCodec для Android, чтобы декодировать поток MP4 с различными разрешениями.releaseOutputBuffer для разных разрешений
Я использую встроенную функциональность для визуализации поверхности, вызывая AMediaCodec_releaseOutputBuffer
с флагом render
, установленным в true.
Я обнаружил, что каждый раз, когда изменяется разрешение, на поверхности размером с новое разрешение выводится несколько кадров старого разрешения. Он может выглядеть примерно так: шаг за шагом в разрешении:
+------------------+-------------+
| frame of old res | |
| displayed too | |
| small | |
+------------------+ |
| |
| size of new resolution |
+--------------------------------+
После нескольких кадров видео снова выглядит нормально. Я подозреваю, что это связано с изменением размера поверхности, когда входной буфер помещается в очередь с новым разрешением, а не когда первый выходной буфер этого разрешения выгружен.
Неужели кто-нибудь сталкивался с этой проблемой раньше?
Интересно эта проблема никогда не воспитала его голова на моей ADT-1 устройство, только на моем новом Nexus Player. – Jack
Является ли ваш декодер настроен на работу в режиме «metadata-on-output-buffers» или в общем режиме? Когда разрешение изменяется, декодер попытается вывести ожидающие фреймы в очередь. Поэтому, если выделенный буфер достаточно велик для обработки текущего разрешения, вы должны получить событие «portsettingschanged» в рамках. Можете ли вы указать, какую версию 'android' вы работаете и делитесь любыми записанными журналами в' ACodec'? – Ganesh