SurfaceTexture.updateTexImage() 由于上下文无效而失败
SurfaceTexture.updateTexImage() fails because of ivalid context
我有一个应用程序,可以从相机捕获视频。
我使用 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时,会出现这个错误。
知道为什么吗?
第一个线索是您的 Surface 与 GlContext 分离。
我不知道你在哪里举了这个例子,但我认为当相机变为 null 时,你可以预期其余实例也将被取消或无效。一切都需要重新创造。通常,大部分初始化是在派生自 GlSurfaceView
的视图的构造函数中完成的。
换句话说:确保您完成与第一个 运行 相同的步骤。做一个"Initialize()"方法。
有这个旧的 tutorial 显示相机在表面上的基本用法。
我有一个应用程序,可以从相机捕获视频。 我使用 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时,会出现这个错误。
知道为什么吗?
第一个线索是您的 Surface 与 GlContext 分离。
我不知道你在哪里举了这个例子,但我认为当相机变为 null 时,你可以预期其余实例也将被取消或无效。一切都需要重新创造。通常,大部分初始化是在派生自 GlSurfaceView
的视图的构造函数中完成的。
换句话说:确保您完成与第一个 运行 相同的步骤。做一个"Initialize()"方法。
有这个旧的 tutorial 显示相机在表面上的基本用法。