2015-01-25 2 views
0

Я использую декодер MediaCodec для вывода данных на поверхность. Используя функцию .configure, я передал поверхность, созданную через surfaceComposerClient. Проблема в том, что кодек не запускается. Я предполагаю, что это проблема с настройкой моей поверхности (когда я установил поверхность в NULL, начало кодека)Декодирование MediaCodec на поверхность изначально

Посмотрите на примеры Java-декодера MediaCodec, мне кажется, что мне нужно создать покрытую EGL SurfaceTexture. Можно ли создать текстуру поверхности с использованием C++/NDK? Есть ли там примеры?

ответ

3

Я предполагаю, что это не «нормальное» приложение, так как вы напрямую взаимодействуете с SurfaceFlinger.

Примеры в некоторых внутренних тестах OpenGL - код был исправлен для версии 5.0 Lollipop. Взгляните на San Angeles demo, который использует класс WindowSurface, чтобы получить поверхность от SurfaceComposerClient.

Для декодирования видео на поверхность вам не нужна поверхностная текстура или что-либо делать с EGL. Поверхности имеют структуру производителей-потребителей, а EGL и MediaCodec - два разных примера производителей. (SurfaceFlinger является потребителем.)

Невозможно понять, почему MediaCodec не работает. Вы можете попробовать рисовать на поверхности с помощью GLES, чтобы узнать, действительно ли это, но я предполагаю, что ваша проблема в другом месте.

Для SurfaceTexture приложение является как производителем, так и потребителем; он обеспечивает способ декодирования видео на поверхность, которую затем можно манипулировать как текстуру GLES. Это добавляет лишние накладные расходы, если вы хотите, чтобы видео воспроизводилось на экране.

0

обратитесь к SimplePlayer.h & .cpp в исходный код Android-4.4. он используется для декодирования медиафайла и вывода декодированного видео на поверхность. Я думаю, что это похоже на ваш сценарий.

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