Я работаю над приложением для кодирования видео, которое я хочу предотвратить, если действие Хостинг входит в фоновый режим, или экран выключается/включается.
Архитектура моего кодировщика основана на отличном примере CameraToMpegTest с добавлением отображения кадров камеры в GLSurfaceView (см. Github ссылки ниже). В настоящее время я выполняю фоновое замещение с помощью решения с двумя состояниями:
-
Когда объект хостинга находится на переднем плане, закодируйте один видеокадр при каждом вызове
GLSurfaceView.Renderer
onDrawFrame
. Это позволяет мне получить доступ к состоянию EGL GLSurfaceView в пакетах, чтобы не блокировать другие события, помещенные в очередь на поток рендеринга. -
Когда хостинг-активность входит в фоновый режим, остановите кодировку
onDrawFrame
и закодируйте кадры на другом фоновом потоке в цикле. Этот режим идентичен примеру CameraToMpegTest.
Однако, если экран выключен, GLCurfaceView EGLContext теряется и появляется новый вызов onSurfaceCreated
. В этом случае мы должны воссоздать поверхность окна EGL, подключенную к поверхности ввода MediaCodec. К сожалению, этот 2-й вызов eglCreateWindowSurface
дает:
E/libEGL(18839): EGLNativeWindowType 0x7a931098 already connected to another API
До вызова я освободит все ресурсы EGL, подключенные к поверхности Android.
Есть ли способ поменять EGSL-поверхность, связанную с поверхностью ввода MediaCodec?
Полный источник моего тестового приложения находится на Github. Основная деятельность.
Обновление. Я применил полученные здесь уроки в виде видео sdk для Android на основе классов MediaCodec и MediaMuxer. Надеюсь, это поможет!