谁在SurfaceTexture中渲染时从相机旋转框架?

问题描述:

更新:问题是关于相机2谁在SurfaceTexture中渲染时从相机旋转框架?

我想弄清楚谁是在SurfaceTexture上绘制相机预览时应用旋转变换。

当请求从相机预览大小,你总是对其中宽度高度较大(因为风景拍照时是通常的方向)。

当使用在纵向模式的设备和设置预览大小(前1600 X1200)来自摄像机的帧正确地旋转,但我不能找出它做了,是什么事情CameraDevice并自动根据表面类型?或者是旋转图像的SurfaceTexture

答案取决于一点你使用哪个摄像头API;既然你提到CameraDevice,我认为你的意思是camera2。

在camera2,的目标之一是在可能的情况,以简化所述旋转处理;所以如果您将预览绘制到SurfaceView中,摄像头服务和硬件合成器/ GPU协作并为您处理所有旋转。您总是从传感器请求横向分辨率(与传感器的长边对齐,以匹配设备的长边),并且您只需确保SurfaceView的纵横比与请求分辨率的纵横比相匹配(因此在纵向,您需要9:16视图才能正确显示1080p;在横向上,您需要16:9视图)。

对于TextureView,并完全自定义的GL与表面纹理绘制,该API无法做到这一切为你。 SurfaceTexture的变换由相机API设置,以将相机输出旋转到设备的原生方向(通常手机肖像,某些平板电脑的横向),但如果您的应用的UI未处于原生方向,则无法处理额外旋转。

在这种情况下,你需要得到来自SurfaceTexure变换矩阵,申请额外的旋转,以配合您的应用程序的用户界面,并设置为TextureView矩阵。

+0

我正在寻找关于相机服务和GPU“合作”的确认。谢谢 –

它已经一年左右,因为我曾在相机的东西,所以我对缺乏具体的道歉。但我记得显示Camera preview时的关键是计算正确的变换矩阵,以应用于SurfaceView(或TextureView)以应用所需的任何缩放或旋转。所以关于“谁在轮换”我想你可以说这是你的观点,正如你提供的变换所指示的那样。因此矩阵将基于您请求的预览分辨率(来自您的设备的能力列表)与您的视图的实际布局尺寸之间的关系,以及设备传感器与电流相比的物理方位设备屏幕的方向。

在旧照相机API,Camera.CameraInfo具有提供与该传感器安装在所述物理定向的定向字段。在大多数手机上安装传感器的传感器通常为90,但您也会发现其中有270个(实际上是“颠倒”)。 0和180可能存在,但我从未见过它们。