API 23 - camera2 - 活动

时间:2018-03-04 21:27:11

标签: android android-service android-camera2 android-mediarecorder android-background

我是初学者。我想写一个应用程序,它有很多活动,其中一个用于在背景上设置视频录制但在摄像机预览中。所以当我离开活动时,录音必须继续。

  • 我从主要活动开始提供服务。此服务管理相机和视频录制。
  • 服务包含已初始化和准备好的" MediaRecorder实例," 录像机"。它设置为来自表面,如 recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE)
  • 相机由 cameraManager.openCamera(cameraId等) cameraDevice.createCaptureSession(surfaceList等)打开,其中surfaceList包含MediaRecorder实例和曲面的曲面来自在此服务的 onCreate 函数中创建的 SurfaceTexture实例
  • 捕获由 cameraDevice.createCaptureRequest(一些参数) cameraCaptureSession.setRepeatingRequest(一些参数)完成。当然,我不会忘记通过requestBuilder.addTarget()添加曲面。
  • 我将SurfaceTexture实例传递给上层活动,然后将其传递给现有的TextureView UI元素,如 textureView.setSurfaceTexture(surfaceTextureFromTheService)。效果很好。
  • 我可以通过 recorder.start()开始将视频录制到文件中。录制效果很好,也可以预览相机。
  • 现在!我想完全离开活动(但仍留在应用中)并且以某种方式从活动用户界面中删除surfaceTextureFromTheService。如果我只是离开活动,我会得到一个例外:

E / BufferQueueProducer:[SurfaceTexture-0-29154-1] dequeueBuffer:BufferQueue已被放弃 03-04 22:08:47.525 29154-29440 / com.example.hakka.androidcarhelper I / Adreno:DequeueBuffer:dequeueBuffer failed 03-04 22:08:47.525 29154-29440 / com.example.hakka.androidcarhelper E / CameraDeviceGLThread-0:GL渲染线程上收到的异常:                                                                                             java.lang.IllegalStateException:swapBuffers:EGL错误:0x300d                                                                                                 在android.hardware.camera2.legacy.SurfaceTextureRenderer.checkEglError(SurfaceTextureRenderer.java:530)                                                                                                 在android.hardware.camera2.legacy.SurfaceTextureRenderer.swapBuffers(SurfaceTextureRenderer.java:523)                                                                                                 在android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:727)                                                                                                 在android.hardware.camera2.legacy.GLThreadManager $ 1.handleMessage(GLThreadManager.java:105)                                                                                                 在android.os.Handler.dispatchMessage(Handler.java:98)                                                                                                 在android.os.Looper.loop(Looper.java:148)                                                                                                 在android.os.HandlerThread.run(HandlerThread.java:61)

我理解如果我尝试在不释放 surfaceTextureFromTheService 的情况下离开活动,我会做错事。 但是怎么做?我如何发布surfaceTextureFromTheService但是在我返回活动后仍然可以重新使用它?当然没有在服务中再次调用cameraDevice.createCaptureRequest cameraCaptureSession.setRepeatingRequest ,因为如果MediaRecorder 正在录制我不想要每次我离开并返回活动时停止它。

我每天花费大约6天12小时来解决这个问题。但仍然没有运气。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以在不中断录制的情况下调用setRepeatingRequest,因此当您转到后台时,请将重复请求替换为仅定位到介质记录器Surface的请求。这应该避免你看到的错误。

那就是说,回到活动并没有真正符合你的计划;如果我没记错的话,当Activity不再可见时,TextureView EGL上下文等会被拆除。而且TextureView获得了SurfaceTexture的所有权,所以一旦TextureView消失了,我就不会认为SurfaceTexture可以再次使用。

为了更灵活,您可能需要使用GLSurfaceView和一堆样板EGL构建自己的TextureView等效项;每次进入/退出Activity时,你都需要从EGL上下文中附加和分离SurfaceTexture,并处理SurfaceTexture到quad的渲染。