Запись выбранной области экрана в Android

Я пытаюсь реализовать запись экрана. Я подписался на grafika . Простое предоставление Surface от encoder.getInputSurface() к VirtualDisplay делает свое дело. Теперь моя задача кодировать определенную часть экрана. Итак, я пытался изменить входную поверхность для кодировщика с помощью SurfaceTexture (я думаю, что это правильный метод). Но я не могу использовать созданную поверхность для записи экрана, и когда я передаю эту поверхность в VirtualDisplay, я не получаю обратного вызова. Я также пытался записывать с помощью TextureMovieEncoder (из графика), но, возможно, я не знаю правильного метода.

Я пытался понять, следуя полезным ссылкам. Как выходная поверхность декодера передается на входную поверхность кодировщика?

а также

Android: возможно ли создать SurfaceTexture без SurfaceView?

И я уверен, что графика — отличный учебник, но я застрял.

Пожалуйста, предложите решение или другой рабочий метод. Теперь я застрял на несколько дней.


person singularity    schedule 20.02.2019    source источник


Ответы (1)


Я думаю, что правильный путь заключается в следующем:

  1. создайте SurfaceTexture с текстурой oes.

  2. подключите VirtualDisplay к текстуре поверхности, созданной на шаге 1, чтобы кадр перешел к текстуре oes

  3. Зарегистрируйте прослушиватель onFrameAvailable на поверхности текстуры, тогда вы будете получать обратный вызов непрерывно

  4. Рендеринг кадра в текстуре oes на входную поверхность энкодера.

Ключевым процессом является шаг 4. В процессе рендеринга вы можете обрезать кадр, изменяя координату текстуры.

Ниже приведен пример кадрирования: Обрезать видео кодирование с помощью MediaCodec для непрерывного захвата Grafika

person dragonfly    schedule 22.03.2019
comment
Спасибо за ответ. Я не утомил ваш ответ, но нашел идеальный проект на git. github.com/junyuecao/AndroidScreenRecordAndCrop - person singularity; 02.05.2019
comment
Где в этом проекте функция кадрирования!? Я могу только захватить экран с ним ... - person isabsent; 07.12.2019