2014-01-12 3 views
0

Я использую SurfaceTexture для предварительного просмотра камеры. Это отправляет поток данных непосредственно на GPU в виде текстуры.Камера Android surfaceTexture - Как сохранить предыдущие кадры?

Эта текстура получает перезаписана с каждой новой кадр камеры приходит в

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

Данные, поступающие с камеры, всегда будут перезаписывать самую старую текстуру из n количества доступных текстур. Мне просто нужно чередовать их.

Этих текстуры должны быть доступны для немедленного предоставления, так как данные поступают в

Мне не нужно:., Чтобы сохранить полученные данные в виде байтового буфера и преобразовать его обратно в новые текстуры = медленно, все должно быть в режиме реального времени время. Здесь важна производительность.

Я использовал этот пример программы для запуска камеры в режиме surfaceTexture: http://maninara.blogspot.co.uk/2012/09/render-camera-preview-using-opengl-es.html

Я попытался приклеить новую текстуру, используя attachToGLContext (INT texName) метод класса SurfaceTexture, но это не кажется, что позволяет мне сделать это, не разрушая предыдущую, кажется, что я должен использовать «detachFromGLContext()» перед установкой новый ..

http://developer.android.com/reference/android/graphics/SurfaceTexture.html

Любая помощь приветствуется.

ответ

0

Как вы отправляете поток данных в текстуру?

В моем случае я создаю несколько текстур в onSurfaceCreated. Затем перепишите их в onDraw. Весь процесс в режиме реального времени и не требует фреймбуфера для хранения данных.

В onDraw, я использую glActiveTexture и glBindTexture, чтобы выбрать текстуру, которую я хочу переписать. Вот код, надеюсь, что это поможет.

GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + texture_index); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, m_texture[texture_index]); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, m_frame.width, m_frame.height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, camera_data);

+0

Живая текстура питается .updateTexImage(). Итак, вкратце ?: 1. onDraw: используйте glGenTextures для резервирования свободных слотов для текстур, которые будут сохранены. 2. Поток из предварительного просмотра камеры поступает в виде текстуры, а не как данные изображения (GLES11Ext.GL_TEXTURE_EXTERNAL_OES, hTex [0 ]). Поэтому я буду использовать glGetTexImage для получения ссылки на данные изображения (вы назвали его «camera_data»), используя это: glGetTexImage (GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, формат, тип, camera_data)) 3. Следуя инструкциям. Правильно ли это выглядит? Будет ли следующий кадр не перезаписывать текстуру, которую мы только что сохранили? – Jayco

+0

Теперь важно для меня различать, что здесь происходит ?: Позволяет сказать, что данные одного изображения - 3 МБ. Когда камера подает текстуру предварительного просмотра, она перемещает 3 МБ на графический процессор только один раз на кадр и отображает: (Захват камеры -> перемещение 3 МБ -> рендеринг графического процессора). Когда мы делаем все это сохранение кадра, мы: Перемещение ссылок на данные 3 МБ? (это именно то, что я хотел) Вот так: (Camera capt. -> move 3MB -> GPU rend. -> получить ссылку на 3MB и сохранить) Или мы перемещаем фактическое 3 МБ более одного раза? Например: (Захват камеры -> перемещение 3 МБ -> разгон графического процессора. -> Переместите 3 МБ в текс снова) Thx – Jayco

+0

1. Да, используйте glGenTextures, чтобы зарезервировать свободные слоты для текстур, которые будут сохранены. 2. Я не использовал glGetTexImage раньше, я думаю, что ваш путь прав. 3. Используйте glActiveTexture и glBindTexture, чтобы выбрать слот, который вы хотите перезаписать.Поэтому вы можете зарезервировать слоты, которые вы не хотите перезаписывать. 4. Я думаю, что процесс (перемещение 3MB -> получить текстуру) происходит, когда вы вызываете glGetTexImage, поэтому, если вы не вызываете glGetTexImage снова на одном кадре, перемещение 3MB будет выполняться один раз на каждый кадр. – gloompisces

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