我有一个应用程序,可以从相机中捕获视频。 我是用于显示预览的GLSurfaceView和用于编码的MediaCodec。 GlSurfaceView拥有自己的GLThread和EGLContext,我正在为MediaCodec创建另一个线程并在该线程中初始化另一个EGLContext。它工作正常,我可以录制视频。
当我尝试最小化然后恢复应用程序时出现问题。调用SurfaceTexture.updateTexImage()会导致IllegalStateException,logcat会显示以下消息:
02-19 18:19:58.400 8528-15845 E/GLConsumer:[unnamed-8528-0] checkAndUpdateEglState: invalid current EGLContext
02-19 18:19:58.400 8528-15845 E/_GLViewRender: error updating text image
02-19 18:19:58.400 8528-15845 E/_GLViewRender: java.lang.IllegalStateException: Unable to update texture contents (see logcat for details)
02-19 18:19:58.400 8528-15845 E/_GLViewRender: at android.graphics.SurfaceTexture.nativeUpdateTexImage(Native Method)
02-19 18:19:58.400 8528-15845 E/_GLViewRender: at android.graphics.SurfaceTexture.updateTexImage(SurfaceTexture.java:240)
02-19 18:19:58.400 8528-15845 E/_GLViewRender: at ui.GLSurfaceViewRender.onDrawFrame(GLSurfaceViewRender.java:105)
02-19 18:19:58.400 8528-15845 E/_GLViewRender: at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1583)
02-19 18:19:58.400 8528-15845 E/_GLViewRender: at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1286)
当应用最小化时我正在做什么:
停止相机预览:
if (isPreviewOn && mCamera != null) {
isPreviewOn = false;
mCamera.stopPreview();
}
发布相机:
try {
mCamera.setPreviewTexture(null);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.release();
mCamera = null;
致电
GLSurfaceView.onPause()
应用恢复时我在做什么:
致电
GLSurfaceView.onPause()
打开相机,设置预览表面纹理,然后开始预览
if (mCamera == null) {
mCamera = Camera.open(CAMERA_ID);
params = mCamera.getParameters();
}
try {
mCamera.setPreviewTexture(renderer.getSurfaceTexture());
} catch (IOException e) {
Log.e(TAG, "error setting ST to preview", e);
return;
}
if (!isPreviewOn && mCamera != null) {
isPreviewOn = true;
mCamera.startPreview();
}
下次调用updateTextImage时,会发生此错误。
任何想法为什么?
答案 0 :(得分:2)
第一个线索是您的Surface与GlContext分离。
我不知道你把这个例子放在哪里,但我认为当相机变为空时,你可以预期其余的实例也会无效或无效。一切都需要重新创建。通常,大多数初始化都是在视图的构造函数内完成的,该构造函数派生自GlSurfaceView
。
换句话说:确保您通过与第一次运行期间相同的步骤。制作"初始化()"方法
有一个旧的tutorial显示了相机使用表面的基本知识。