![](/img/trans.png)
[英]Android Camera2 API preprocessing and writing frames in SurfaceTexture
[英]Camera2: SurfaceTexture buffer size is being overridden
我正在使用 Camera2 API 编写一个应用程序,它应该显示来自相机的预览并拍照。 目前我的代码工作如下:
TextureView.SurfaceTextureListener.onSurfaceTextureAvailable
被调用TextureView
的SurfaceTexture
调用新大小的setDefaultBufferSize
TextureView
开始显示来自相机的图像onPause
之后都会被清除,并且在onResume
之后再次执行步骤 1-4Surface
实例在 Fragment 和相机逻辑类之间共享:共享变量在TextureView.SurfaceTextureListener.onSurfaceTextureAvailable
中使用它进行初始化,并在调用TextureView.SurfaceTextureListener.onSurfaceTextureDestroyed
时设置为 null 这适用于一些流行品牌的现代 Android 版本的设备,但该应用程序应该适用于具有 Android 6 的特定通用中国平板电脑(“ CameraManager: Using legacy camera HAL
”),我遇到了一个问题。
setDefaultBufferSize
的大小为 1280x720Surface::setBuffersUserDimensions(this=0x7f55fb5200,w=640,h=480)
消息setDefaultBufferSize
,并且只有在应用程序最小化后重新创建视图时,才会“拾取”所需的分辨率setDefaultBufferSize
传递给TextureView.post
,它解决了问题,除了我应该询问用户对相机片段的权限(即当用户第一次打开相机时),所以片段是暂停几次以显示权限弹出窗口。 但是,如果没有TextureView.post
,在主线程中也会调用setDefaultBufferSize
,所以我猜TextureView.post
造成的延迟是这里的游戏规则改变者setDefaultBufferSize
文档中,我看到:新的默认缓冲区大小将在图像生产者下一次请求填充缓冲区时生效。 对于 Canvas 这将是下一次 Surface.lockCanvas 被调用。 对于 OpenGL ES,应销毁 EGLSurface(通过 eglDestroySurface),使其变为非当前(通过 eglMakeCurrent),然后重新创建(通过 eglCreateWindowSurface)以确保新的默认大小已生效。 在我看来,这可能与案件有关通过覆盖onSurfaceTextureSizeChanged
的SurfaceTextureListener
并使用所需的预览大小调用surfaceTexture.setDefaultBufferSize
解决了这个问题。 当默认缓冲区大小被不正确的大小覆盖时(在初始化期间),这个方法被调用,我再次覆盖它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.