2016-03-27 2 views
5

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

textureView.getBitmap(); 

Результаты в низкой производительности существует более быстрый способ получения растрового изображения. Лучше ли использовать NDK?

В поисках реальных примеров

+0

Вам удалось ускорить получение растрового изображения из TextureView? –

ответ

3

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

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

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

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

+0

Я хочу сделать некоторую обработку на распознавании образа кадра. Таким образом, распознавание в реальном времени в кадрах теперь является проблемой: вызов .getBitmap() занимает примерно 50-60 мс. Я могу решить это, уменьшив битмап, который сокращает время, но затем я также хочу снова отобразить кадры в виде текстуры. Как бы вы предложили мне заниматься самой работой GLES? – AndyRoid

+0

GLES рендеринг + 'glReadPixels()' должен быть намного быстрее. Если ваши требования к дисплею просты (поверх слоя «Вид» или полностью под ним), вы можете просто визуализировать текстуру SurfaceView. Поэтому вы направляете свои входящие кадры на SurfaceTexture и визуализируете текстуру SurfaceView, вызывая 'glReadPixels()' перед 'eglSwapBuffers()', чтобы захватить копию пикселей. Это даст вам буфер с прямым байтом с пикселями RGB, который вы можете использовать из кода Java или C++. У меня нет точного примера, но различные фрагменты можно найти в Grafika (https://github.com/google/grafika). – fadden

+0

Благодарим вас за подробный ответ! – AndyRoid

-4

Одним из способов оптимизации является запуск в фоновом режиме в асинхронной задачи, как это:

private class AsyncTaskRunner extends AsyncTask<> 
{ 

     @Override 
     protected void doInBackground() 
     { 

     // this is where you put long operations in background 
      textureView.getBitmap(); 

     } 
} 
+0

Вы действительно протестировали это? – AndyRoid

+1

Ваш ответ совершенно неверен, так как вы не можете вызывать .getBitmap из потока пользовательского интерфейса. – AndyRoid

+2

Кроме того, AsyncTask работает с более низким приоритетом, поэтому не рекомендуется использовать его, когда производительность важна. – fadden

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