Эффективно получать растровое изображение из TextureView

Я пытаюсь получить каждый кадр из TextureView, к сожалению, пытаясь:

textureView.getBitmap();

Приводит к снижению производительности. Есть ли более быстрый способ получить растровое изображение. Вместо этого лучше использовать NDK?

Ищем реальные примеры


person AndyRoid    schedule 27.03.2016    source источник
comment
Удалось ли вам ускорить получение растрового изображения из TextureView?   -  person Android developer    schedule 02.11.2016


Ответы (1)


TextureView получает кадры на SurfaceTexture, который берет кадры, отправленные на его поверхность, и преобразует их в текстуру GLES. Чтобы получить данные о пикселях, текстура должна быть передана в буфер кадра, а затем прочитана с помощью glReadPixels(). Затем данные пикселей можно обернуть объектом Bitmap (что может включать или не включать копирование данных пикселей).

Использование NDK не принесет вам много пользы, так как весь код, который должен выполняться быстро, уже реализован изначально.

Вы можете увидеть некоторое улучшение, отправляя данные непосредственно в SurfaceTexture и выполняя работу GLES самостоятельно, но, по-видимому, вы хотите отображать входящие кадры в TextureView, поэтому все, что вы потенциально сэкономите, — это накладные расходы Bitmap (которые могут или не могут быть быть значительным).

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

person fadden    schedule 28.03.2016
comment
Я хочу немного обработать распознавание изображений в кадре. Таким образом, распознавание кадров в реальном времени сейчас проблема в том, что вызов .getBitmap() занимает примерно ~ 50-60 мс. Я могу решить эту проблему, уменьшив растровое изображение, что сократит время, но затем я также хочу повторно отобразить кадры обратно в вид текстуры. Как бы вы предложили мне заняться работой с GLES самостоятельно? - person AndyRoid; 29.03.2016
comment
Рендеринг GLES + glReadPixels() должен быть намного быстрее. Если ваши требования к отображению просты (поверх слоя View или полностью под ним), вы можете просто визуализировать текстуру в SurfaceView. Таким образом, вы направляете входящие кадры в SurfaceTexture и визуализируете текстуру в SurfaceView, вызывая glReadPixels() перед eglSwapBuffers(), чтобы получить копию пикселей. Это даст вам прямой байтовый буфер с пикселями RGB, который вы можете использовать из кода Java или C++. У меня нет точного примера, но различные фрагменты можно найти в Grafika (github.com/google. /графика). - person fadden; 29.03.2016
comment
Спасибо за подробный ответ! - person AndyRoid; 29.03.2016
comment
Если бы вы могли напрямую связать меня с примером, это было бы мило. - person AndyRoid; 29.03.2016
comment
Также вы упомянули, что AsyncTask может иметь прямое влияние на производительность из-за более низкого приоритета. Я заметил, что в Grafika ReadPixelsActivity они используют асинхронную задачу, будет ли Handler лучшей альтернативой? - person AndyRoid; 29.03.2016
comment
Я узнал об AsyncTask уже после написания кода; обратите внимание на комментарий здесь: github.com /google/grafika/blob/master/src/com/android/grafika/ . Вы можете настроить поток рендерера SurfaceView и выполнять всю работу там. Все примеры Grafika используют Looper/Handler для управления взаимодействиями между основным и рабочим потоками. - person fadden; 29.03.2016
comment
Огромное спасибо, также я заметил, что внутри OpenGL есть класс Matrix. Могу ли я использовать его для работы с интенсивными вычислениями? Возможно на каждом кадре? - person AndyRoid; 29.03.2016
comment
Если вы хотите использовать GPU для вычислений, вам нужно изучить RenderScript. Класс Matrix — это всего лишь служебный класс для создания и изменения матриц для передачи в GLES. - person fadden; 29.03.2016
comment
Есть хорошие примеры с RenderScript и OpenGL? Я хочу отображать видео с помощью OpenGL и выполнять вычисления с помощью RenderScript. Я использовал RenderScript для базовой обработки изображений заранее, но не для вычислений. - person AndyRoid; 29.03.2016
comment
Извините, у меня нет примеров, чтобы порекомендовать. - person fadden; 29.03.2016
comment
Эй, @fadden, возвращаясь к этому сегодня, ищу конкретный пример того, о чем вы говорите в отношении извлечения кадров из файла SurfaceTexture. В частности, я перенес GLSurfaceView в GLTextureView, как мне извлечь кадры из набора MP4 в пользовательский GLTextureView, который воспроизводит видео? Как мне заставить видео правильно отображаться в GLTextureView? - person AndyRoid; 06.04.2016