Получение кадра из SurfaceView

Трудность, с которой я столкнулся сейчас, состоит в том, чтобы сделать снимок экрана SurfaceView. Может ли кто-нибудь помочь, пожалуйста?

Моя команда работает над проектом Android, где мы используем MediaCodec для декодирования видеопотока и его рендеринга на поверхность. Деятельность реализует

SurfaceHolder.Callback

Затем мы создали SurfaceView и добавили обратный вызов:

mySurfaveView.getHolder().addCallback(this);

Затем мы начинаем декодировать подачу видео (у нас есть метод, который выполняет декодирование)

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

Видео работает нормально, теперь я хочу сделать скриншот того, что отображается на SurfaceView. Я пробовал несколько способов сделать это, но мне не удалось. Вот что я пробовал:

  1. Я устал получать кеш рисования rootView.
  2. Пробовал получать кадр прямо из MediaCodec.
  3. Пробовал метод draw() рисовать на холсте.

На данный момент я пытаюсь создать пользовательский SurfaceView и переопределить там метод onDraw. Тем не менее, я никогда не создавал пользовательский SurfaceView. Я в правильном направлении?

Помогите, пожалуйста. Спасибо!

1 ответ

Решение

Вы не можете захватить SurfaceView, как объяснено в этом другом вопросе.

SurfaceViews редко захотят переопределить onDraw(), Как правило, часть View SurfaceView представляет собой прозрачное отверстие.

Для конкретного случая вывода MediaCodec у вас есть несколько вариантов. Вы можете направить вывод в SurfaceTexture, а затем дважды визуализировать видеокадр, используя OpenGL ES. Один раз на SurfaceView для отображения, один раз на внеэкранный буфер, из которого вы можете захватывать пиксели.

Другой подход заключается в замене SurfaceView на TextureView, а затем использовать getBitmap() позвоните, чтобы захватить видеокадры.

Различные примеры можно найти в Графика.

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