Ответ 1
Я не могу предоставить какой-либо код для этого, к сожалению, но я сделаю все возможное, чтобы объяснить это, основываясь на том, как я получил его для работы.
Итак, вот мой обзор того, как я получил исходное кодированное видео H.264 для работы с использованием класса MediaCodec (http://developer.android.com/reference/android/media/MediaCodec.html).
Используя приведенную выше ссылку, приведен пример получения установки декодера и способа ее использования, вам нужно будет настроить его для декодирования H264 AVC.
Формат H.264 состоит в том, что он состоит из блоков NAL, каждый из которых начинается с префикса запуска из трех байтов со значениями 0x00, 0x00, 0x01, и каждый блок имеет другой тип в зависимости от значения 4-го байта сразу после этих 3 стартовых байтов. Один блок NAL НЕ один кадр в видео, каждый кадр состоит из нескольких блоков NAL.
В основном я написал метод, который находит каждый отдельный блок и передает его в декодер (один блок NAL является стартовым префиксом и любыми байтами там до следующего стартового префикса).
Теперь, если у вас есть установка декодера для декодирования H.264 AVC и у вас есть InputBuffer из декодера, тогда вы готовы к работе. Вам необходимо заполнить этот InputBuffer модулем NAL и передать его обратно в декодер и продолжить делать это для длины потока. Но для выполнения этой работы мне пришлось сначала передать декодер SPS (набор параметров последовательности) NAL Unit. Этот блок имеет байтовое значение 0x67 после стартового префикса (4-й байт), на некоторых устройствах декодер будет сбой, если он не получит это устройство в первую очередь. В основном, пока вы не найдете это устройство, игнорируйте все другие блоки NAL и продолжайте разбор потока до тех пор, пока не получите это устройство, тогда вы можете передать все остальные единицы в декодер.
Некоторые устройства не нуждались в SPS, и некоторые сделали, но лучше сначала перенести его.
Теперь, если у вас была поверхность, которую вы передали декодеру, когда вы ее настроили, тогда, когда он получит достаточное количество блоков NAL для кадра, он должен отображать его на поверхности.