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

android surfaceview

4695 просмотра

1 ответ

Я работаю в 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  
Автор: marimuthu Источник Размещён: 12.11.2019 09:26

Ответы (1)


5 плюса

Решение

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

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

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

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

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

Автор: fadden Размещён: 15.12.2014 04:48
Вопросы из категории :
32x32