【问题标题】:Camera2: SurfaceTexture buffer size is being overriddenCamera2:SurfaceTexture 缓冲区大小被覆盖
【发布时间】:2022-02-01 18:24:31
【问题描述】:

我正在使用 Camera2 API 编写一个应用程序,它应该显示来自相机的预览并拍照。目前我的代码工作如下:

  1. Camera Fragment实例化后,等待TextureView.SurfaceTextureListener.onSurfaceTextureAvailable被调用
  2. 在 ViewModel 中,从 CameraCharacteristics 获取可用且合适的图片和预览尺寸,并使用 LiveData 将找到的预览尺寸发送到 Fragment
  3. Fragment 观察预览大小 LiveData 并调用 setDefaultBufferSize 并为其 TextureViewSurfaceTexture 提供新大小
  4. 设置新尺寸后,会创建捕获会话并设置重复预览请求,因此TextureView 开始显示来自相机的图像
  5. 为避免干扰其他相机应用程序的工作,在Fragment的onPause之后清除所有与相机相关的东西,并在onResume之后再次执行步骤1-4
  6. Surface 实例在 Fragment 和相机逻辑类之间共享:共享变量在 TextureView.SurfaceTextureListener.onSurfaceTextureAvailable 中使用它进行初始化,并在调用 TextureView.SurfaceTextureListener.onSurfaceTextureDestroyed 时设置为 null

这适用于一些流行品牌的现代 Android 版本的设备,但该应用程序应该适用于特定的 Android 6 通用中国平板电脑(“CameraManager: Using legacy camera HAL”),我面临一个问题。

  • 实例化相机并开始预览时,我看到预览尺寸为 640x480(因此图像被拉伸),但是,传递给 setDefaultBufferSize 的尺寸为 1280x720
  • Lo​​gcat 也充满了连续的Surface::setBuffersUserDimensions(this=0x7f55fb5200,w=640,h=480) 消息
  • 我在 SO 上发现,在某些搭载 Android 5 的三星设备上,Camera2 可能无法真正使用某些分辨率,但这里 当我关闭应用程序并再次打开它时,预览分辨率为 1280x720
  • 所以我的猜测是,我可能会在第一次设置相机片段时过早调用 setDefaultBufferSize,并且只有在应用最小化后重新创建视图时,才会“拾取”所需的分辨率
  • 我还尝试在传递给 TextureView.post 的 lambda 中调用 setDefaultBufferSize,并且 它解决了问题,除了我应该在相机片段上请求用户权限的情况(即当用户打开第一次使用相机),因此 Fragment 会暂停几次以显示权限弹出窗口。但是,如果没有TextureView.post setDefaultBufferSize 在主线程中也被调用,所以我猜TextureView.post 引起的延迟是这里的游戏规则改变者
  • 我在setDefaultBufferSize 文档中也看到:新的默认缓冲区大小将在图像生产者下一次请求填充缓冲区时生效。对于 Canvas,这将是下一次 Surface.lockCanvas 被调用。对于 OpenGL ES,应该销毁 EGLSurface(通过 eglDestroySurface),使其变为非当前(通过 eglMakeCurrent),然后重新创建(通过 eglCreateWindowSurface)以确保新的默认大小已经生效。在我看来,可能是个案

【问题讨论】:

    标签: android android-6.0-marshmallow android-camera2 android-textureview


    【解决方案1】:

    通过覆盖SurfaceTextureListener 中的onSurfaceTextureSizeChanged 并使用所需的预览大小调用surfaceTexture.setDefaultBufferSize 解决了这个问题。当默认缓冲区大小被不正确的大小覆盖时(在初始化期间),这个方法被调用,我再次覆盖它。

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多