Ответ 1
Как и для Android 4.3 (API 18), правильный подход bigflake CameraToMpegTest - правильный путь.
Накладные расходы EGL/SurfaceTexture в настоящее время неизбежны, особенно для того, что вы хотите сделать в цели №2. Идея такова:
- Настройте камеру для отправки вывода на
SurfaceTexture
. Это делает выход камеры доступным для GLES как "внешнюю текстуру". - Отобразите
SurfaceTexture
вSurface
, возвращенныйMediaCodec#createInputSurface()
. Это подает видеокодер. - Повторно введите
SurfaceTexture
, aGLSurfaceView
. Это выводит его на экран для предварительного просмотра в режиме реального времени.
Единственное копирование данных, которое происходит, выполняется драйвером GLES, поэтому вы выполняете аппаратные ускорения, которые будут быстрыми.
Единственный сложный бит - вы хотите, чтобы внешняя текстура была доступна для двух разных контекстов EGL (одна для MediaCodec
, одна для GLSurfaceView
). Вы можете увидеть пример создания общего контекста в примере патча "Захват игрового автомата Android" на большой ленте - он дважды воспроизводит игру, один раз на экран, один раз для кодера MediaCodec
.
Обновление: Это реализовано в Grafika ( "Показать + камеру захвата" ).
Обновление: Многоконтекстный подход в подходе "показать + захват" несколько испорчен. Активность "непрерывного захвата" использует простой SurfaceView и способна выполнять как рендеринг экрана, так и видеозапись с одним контекстом EGL. Это рекомендуется.