2015-01-28 5 views
0

Я использую API NDK MediaCodec для Android, чтобы декодировать поток MP4 с различными разрешениями.releaseOutputBuffer для разных разрешений

Я использую встроенную функциональность для визуализации поверхности, вызывая AMediaCodec_releaseOutputBuffer с флагом render, установленным в true.

Я обнаружил, что каждый раз, когда изменяется разрешение, на поверхности размером с новое разрешение выводится несколько кадров старого разрешения. Он может выглядеть примерно так: шаг за шагом в разрешении:

+------------------+-------------+ 
| frame of old res |    | 
| displayed too |    | 
| small   |    | 
+------------------+    | 
|        | 
|  size of new resolution | 
+--------------------------------+ 

После нескольких кадров видео снова выглядит нормально. Я подозреваю, что это связано с изменением размера поверхности, когда входной буфер помещается в очередь с новым разрешением, а не когда первый выходной буфер этого разрешения выгружен.

Неужели кто-нибудь сталкивался с этой проблемой раньше?

+0

Интересно эта проблема никогда не воспитала его голова на моей ADT-1 устройство, только на моем новом Nexus Player. – Jack

+0

Является ли ваш декодер настроен на работу в режиме «metadata-on-output-buffers» или в общем режиме? Когда разрешение изменяется, декодер попытается вывести ожидающие фреймы в очередь. Поэтому, если выделенный буфер достаточно велик для обработки текущего разрешения, вы должны получить событие «portsettingschanged» в рамках. Можете ли вы указать, какую версию 'android' вы работаете и делитесь любыми записанными журналами в' ACodec'? – Ganesh

ответ

0

Этот конкретный декодер указывает поддержку MediaCodecInfo.CodecCapabilities.FEATURE_AdaptivePlayback?

Я не сталкивался с этой проблемой сам (поскольку я не пробовал декодировать потоки, которые меняют разрешение), но, насколько я знаю, этот флаг функции был введен для правильной обработки этого варианта использования. Если вы видите это поведение на декодере с этим признаком функции, я бы счел его ошибкой (или я не понял фактические последствия этого флага функции должным образом).

+0

«Адаптивное воспроизведение» было введено для поддержки «DASH», которое может иметь изменение разрешения в какой-то момент времени. Как правило, декодеры смогут обрабатывать изменение разрешения, сигнализируя о изменениях параметров порта или обновленных событий на основе стратегии. Декодер, не поддерживающий флаг «адаптивного воспроизведения», все еще может решить декодировать поток, если новое разрешение меньше или равно старому разрешению, и сигнализирует об изменении окна обрезки или, альтернативно, изменит запрос на перераспределение через настройки порта. – Ganesh

2

Спасибо за помощь.

я нашел следующее в MediaCodec documentation:

Для некоторых форматов видео, можно также изменить размер изображения в середине потока. Для этого для H.264 новые значения параметров набора параметров (SPS) и набора параметров изображения (PPS) должны быть упакованы вместе с фреймом обновления мгновенного декодера (IDR) в одном буфере, который затем может быть установлен в очередь в виде обычного входной буфер. Клиент получит возвращаемое значение INFO_OUTPUT_FORMAT_CHANGED из dequeueOutputBuffer() или onOutputBufferAvailable() сразу после изменения размера изображения и до того, как будут возвращены кадры с новым размером.

Всякий раз, когда я получаю новый SPS и PPS, я стараюсь не передавать их на декодер сразу, а скорее добавлять их к следующему I-кадру.

Это решил проблему - изменения разрешения незаметны :)

+0

Резонируйте решение проблемы. – fadden

+0

К сожалению, я забыл сказать! – Jack

Смежные вопросы