Получение кадра из SurfaceView
Трудность, с которой я столкнулся сейчас, состоит в том, чтобы сделать снимок экрана SurfaceView. Может ли кто-нибудь помочь, пожалуйста?
Моя команда работает над проектом Android, где мы используем MediaCodec для декодирования видеопотока и его рендеринга на поверхность. Деятельность реализует
SurfaceHolder.Callback
Затем мы создали SurfaceView и добавили обратный вызов:
mySurfaveView.getHolder().addCallback(this);
Затем мы начинаем декодировать подачу видео (у нас есть метод, который выполняет декодирование)
surfaceChanged(SurfaceHolder holder, int format, int width, int height)
Видео работает нормально, теперь я хочу сделать скриншот того, что отображается на SurfaceView. Я пробовал несколько способов сделать это, но мне не удалось. Вот что я пробовал:
- Я устал получать кеш рисования rootView.
- Пробовал получать кадр прямо из MediaCodec.
- Пробовал метод draw() рисовать на холсте.
На данный момент я пытаюсь создать пользовательский SurfaceView и переопределить там метод onDraw. Тем не менее, я никогда не создавал пользовательский SurfaceView. Я в правильном направлении?
Помогите, пожалуйста. Спасибо!
1 ответ
Вы не можете захватить SurfaceView, как объяснено в этом другом вопросе.
SurfaceViews редко захотят переопределить onDraw()
, Как правило, часть View SurfaceView представляет собой прозрачное отверстие.
Для конкретного случая вывода MediaCodec у вас есть несколько вариантов. Вы можете направить вывод в SurfaceTexture, а затем дважды визуализировать видеокадр, используя OpenGL ES. Один раз на SurfaceView для отображения, один раз на внеэкранный буфер, из которого вы можете захватывать пиксели.
Другой подход заключается в замене SurfaceView на TextureView, а затем использовать getBitmap()
позвоните, чтобы захватить видеокадры.
Различные примеры можно найти в Графика.