2013-09-13 7 views
1

Я использую класс MediaCodec для декодирования видео в формате .mp4, используя код, приведенный в этом link.outputBuffers возвращает нулевой указатель, хотя кадр отображается на экране, используя MediaCodec в Android

Я могу получить визуализированный вывод на экране, но когда я пытаюсь получить доступ к outputBuffers[outIndex], я получаю ошибку с нулевым указателем. Я не могу понять, как получить доступ к буфере кадров, чтобы выполнить некоторую обработку.

ответ

1

Это ожидаемое (хотя и недокументированное) поведение. Вы можете либо отправить вывод на ByteBuffer, либо на номер Surface, но не оба.

Доступны некоторые дополнительные примеры, которые могут быть интересны here. Если вы декодируете до SurfaceTexture, вы можете визуализировать текстуру дважды, один раз до View и один раз на поверхность pbuffer. Вы можете использовать glReadPixels, чтобы получить данные и обработать их, или выполнить обработку в шейдере GLES.

Если вы извлекаете код ByteBuffer, вы должны сами интерпретировать данные, что сложно на устройствах, которые используют собственный формат вывода. Вы заметите из тестов CTS с буфером-буфером, что некоторые устройства не проверяются, потому что формат неизвестен.

+0

Спасибо за разъяснение. Мне действительно хотелось бы получить доступ к данным буфера, преобразовать его в формат Mat Matrix и выполнить некоторую обработку на нем, а затем отобразить его на экране. Любые предложения о том, как это сделать? – Vinodh

+0

Вы можете отобразить его на поверхности pbuffer Surface, извлечь пиксели в виде RGB с помощью 'glReadPixels', выполнить свою обработку, а затем преобразовать результат обратно в текстуру с помощью' glTexImage2D'. Начиная с Android 4.3, нет никакого переносимого способа интерпретации данных в 'ByteBuffer', поэтому GLES - ваш лучший выбор. – fadden

+0

Я заметил, что если мы хотим визуализировать SurfaceTexture, нам нужно использовать createInputSurface(), который доступен только с уровня API 18. Так значит ли это, что если мы хотим разорвать видео на фреймы, мы можем использовать MediaCodec только с Уровень API 18? – Nativ