Как сделать снимок поверхности?

Я работаю в H264 видео рендеринг в приложении Android, используя SurfaceView, Он имеет одну функцию, чтобы сделать снимок при рендеринге видео в режиме просмотра поверхности. Всякий раз, когда я делаю снимок, я получаю только прозрачный / черный экран. я использую getDrawingCache() метод для захвата экрана, который возвращает только нулевое значение. Я использую приведенный ниже код для захвата экрана.

SurfaceView mSUrfaceView = new SurfaceView(this); //Member variable

if(mSUrfaceView!=null)
  mSUrfaceView.setDrawingCacheEnabled(true); // After video render on surfaceview i enable the drawing cache

Bitmap bm = mSUrfaceView.getDrawingCache(); // return null  

1 ответ

Решение

Если вы не рендерите видеокадры H.264 в программном обеспечении с Canvas в View, подход к кешированию чертежей не будет работать (см., Например, этот ответ).

Вы не можете прочитать пиксели из поверхности поверхности SurfaceView. Основная проблема заключается в том, что Surface - это очередь буферов с интерфейсом производитель-потребитель, а ваше приложение на стороне производителя. Потребитель, обычно системный композитор (SurfaceFlinger), может сделать снимок экрана, потому что он находится на другом конце канала.

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

Приложение Grafika демонстрирует различные элементы, хотя ни одно из заданий не решает вашу проблему. Например, "непрерывный захват" направляет предварительный просмотр камеры в SurfaceTexture, а затем визуализирует его дважды (один раз для отображения, один раз для кодирования видео), что аналогично тому, что вы хотите сделать. Вспомогательные классы GLES включают функцию saveFrame(), которая показывает, как использовать glReadPixels() создать растровое изображение.

См. Также документ по архитектуре графической архитектуры на уровне Android.

Другие вопросы по тегам