更新:问题是关于camera2
我试图找出在SurfaceTexture
上绘制摄像头预览时谁应用了旋转变换。
从相机请求预览尺寸时,您总是会得到宽度大于高度的对(因为拍照时景观是通常的方向(。
在肖像模式下使用该设备并设置预览尺寸(对于Ex。1600x1200(时,相机中的帧正确旋转,但我无法确定它的完成位置,是否是CameraDevice
自动基于Surface的东西类型 ?还是旋转图像的SurfaceTexture
?
答案取决于您使用的相机API;由于您提到了cameradevice,所以我认为您的意思是camera2。
在Camera2中,目标之一是在可能的情况下简化旋转处理。因此,如果您将预览纳入SurfaceView,则相机服务和硬件Compositor/GPU协作并为您处理所有旋转。您始终从传感器请求景观分辨率(与设备的长边缘匹配的传感器的长边缘对齐(,并且您只需要确保SurfaceView的长宽比与所请求的分辨率相匹配(因此,在肖像中,在肖像中,因此您需要9:16视图才能正确显示1080p;在景观中,您需要16:9视图(。
对于纹理视图,并完全自定义的GL图纸带有SurfaceTexture,API无法为您完成所有操作。相机API设置了SurfaceTexture的转换,以将相机输出旋转到设备的本机取向(通常用于手机的肖像,某些平板电脑的景观(,但是如果您的应用程序的UI不在本机取向中,则无法处理额外的旋转。
在这种情况下,您需要从SurfaceTexure获取转换矩阵,应用额外的旋转以匹配您的应用程序UI,并将其设置为textureView矩阵。
自从我从事相机工作以来已经大约一年了,所以我为缺乏细节而道歉。但是我确实记得,显示摄像头预览时的键是计算正确的变换矩阵,以应用于SurfaceView(或textureView(以应用所需的任何缩放或旋转。因此,关于"谁在进行轮换",我想您可以说这是视图,如您所提供的转换所指示。因此,矩阵将基于您请求的预览分辨率的关系(从设备有能力的列表中(与视图的实际布置尺寸相比,以及与当前相比的物理方向以及设备传感器的物理方向设备屏幕的方向。
在旧相机API中,Camera.CamerainFo具有一个方向字段,可提供安装传感器的物理方向。在大多数手机上安装的景观传感器通常为90,但是您还会在那里找到约270年代(实际上"倒置"(。0和180可能存在,但我从未见过它们。