在 SurfaceTexture 中渲染时,谁会旋转相机的帧?
Who rotates the frame from a camera when rendering in a SurfaceTexture?
更新:问题是关于 Camera2
我试图找出在 SurfaceTexture
上绘制相机预览时谁应用了旋转变换。
当从相机请求预览尺寸时,您总是会得到 width 大于 height 的对(因为风景是拍照时的通常方向)。
在纵向模式下使用设备并设置预览尺寸(例如 1600 x1200)时,相机的帧正确旋转,但我无法找到旋转的位置,是不是有什么问题 CameraDevice
是否自动基于表面类型?还是旋转图像的 SurfaceTexture
?
我从事相机方面的工作已经大约一年了,所以对于缺乏细节,我深表歉意。但我确实记得显示相机预览时的关键是计算正确的变换矩阵以应用于 SurfaceView(或 TextureView)以应用所需的任何缩放或旋转。所以关于 "who is doing the rotation" 我想你可以说这是视图,正如你提供的转换所指示的那样。因此矩阵将基于您请求的预览分辨率(来自您的设备支持的列表)与视图的实际布局尺寸之间的关系,以及设备传感器的物理方向与当前方向的比较设备屏幕的方向。
在旧相机 API 中,Camera.CameraInfo 有一个方向字段,用于提供安装传感器的物理方向。大多数手机上的横向安装传感器通常为 90,但您也会发现那里有一些 270(有效 "upside down")。 0 和 180 可能存在,但我从未见过它们。
答案在一定程度上取决于您使用的相机 API;既然你提到了 CameraDevice,我假设你指的是 camera2.
在 camera2 中,目标之一是尽可能简化旋转处理;因此,如果您将预览绘制到 SurfaceView 中,相机服务和硬件合成器/GPU 会合作并为您处理所有旋转。你总是从传感器请求横向分辨率(它与传感器的长边对齐,与设备的长边相匹配),你只需要确保你的 SurfaceView 的纵横比与请求的分辨率相匹配(所以在纵向,您需要 9:16 视图才能正确显示 1080p;横向显示时您需要 16:9 视图)。
对于 TextureView,以及使用 SurfaceTexture 完全自定义的 GL 绘图,API 无法为您完成所有工作。 SurfaceTexture 的转换由相机设置 API 以将相机输出旋转到设备的本机方向(通常是手机纵向,某些平板电脑横向),但如果您的应用 [=23] 它无法处理额外的旋转=] 不在本机方向。
在这种情况下,您需要从 SurfaceTexure 获取变换矩阵,应用额外的旋转以匹配您的应用 UI,并将其设置为 TextureView 矩阵。
更新:问题是关于 Camera2
我试图找出在 SurfaceTexture
上绘制相机预览时谁应用了旋转变换。
当从相机请求预览尺寸时,您总是会得到 width 大于 height 的对(因为风景是拍照时的通常方向)。
在纵向模式下使用设备并设置预览尺寸(例如 1600 x1200)时,相机的帧正确旋转,但我无法找到旋转的位置,是不是有什么问题 CameraDevice
是否自动基于表面类型?还是旋转图像的 SurfaceTexture
?
我从事相机方面的工作已经大约一年了,所以对于缺乏细节,我深表歉意。但我确实记得显示相机预览时的关键是计算正确的变换矩阵以应用于 SurfaceView(或 TextureView)以应用所需的任何缩放或旋转。所以关于 "who is doing the rotation" 我想你可以说这是视图,正如你提供的转换所指示的那样。因此矩阵将基于您请求的预览分辨率(来自您的设备支持的列表)与视图的实际布局尺寸之间的关系,以及设备传感器的物理方向与当前方向的比较设备屏幕的方向。
在旧相机 API 中,Camera.CameraInfo 有一个方向字段,用于提供安装传感器的物理方向。大多数手机上的横向安装传感器通常为 90,但您也会发现那里有一些 270(有效 "upside down")。 0 和 180 可能存在,但我从未见过它们。
答案在一定程度上取决于您使用的相机 API;既然你提到了 CameraDevice,我假设你指的是 camera2.
在 camera2 中,目标之一是尽可能简化旋转处理;因此,如果您将预览绘制到 SurfaceView 中,相机服务和硬件合成器/GPU 会合作并为您处理所有旋转。你总是从传感器请求横向分辨率(它与传感器的长边对齐,与设备的长边相匹配),你只需要确保你的 SurfaceView 的纵横比与请求的分辨率相匹配(所以在纵向,您需要 9:16 视图才能正确显示 1080p;横向显示时您需要 16:9 视图)。
对于 TextureView,以及使用 SurfaceTexture 完全自定义的 GL 绘图,API 无法为您完成所有工作。 SurfaceTexture 的转换由相机设置 API 以将相机输出旋转到设备的本机方向(通常是手机纵向,某些平板电脑横向),但如果您的应用 [=23] 它无法处理额外的旋转=] 不在本机方向。
在这种情况下,您需要从 SurfaceTexure 获取变换矩阵,应用额外的旋转以匹配您的应用 UI,并将其设置为 TextureView 矩阵。