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

时间:2017-05-28 10:21:51

标签: android rotation orientation surface camera2

更新:问题是关于Camera2

我试图找出在SurfaceTexture上绘制相机预览时应用旋转变换的人。

从相机请求预览尺寸时,您总是会得到宽度大于高度的对(因为横向是拍摄照片时的常用方向)。

在纵向模式下使用设备并设置预览尺寸(例如1600 x1200)时,相机中的帧被正确旋转但我无法找到它的位置,是CameraDevice的确如此自动基于Surface类型?还是旋转图像的SurfaceTexture

2 个答案:

答案 0 :(得分:2)

答案取决于您使用的相机API;既然你提到CameraDevice,我认为你的意思是camera2。

在camera2中,其中一个目标是尽可能简化旋转处理;因此,如果您将预览绘制到SurfaceView中,相机服务和硬件合成器/ GPU会合作并为您处理所有旋转。您始终要求传感器的横向分辨率(与传感器的长边对齐,与设备的长边对齐),您只需要确保SurfaceView的纵横比与要求的分辨率相匹配(所以在肖像方面,你需要9:16查看才能正确显示1080p;在风景中你需要16:9视图。

对于TextureView,以及使用SurfaceTexture的完全自定义GL绘图,API无法为您完成所有操作。 SurfaceTexture的变换由相机API设置,以将相机输出旋转到设备的原生方向(通常是手机的肖像,某些平板电脑的风景),但它无法处理额外的旋转如果您的应用的用户界面不是原生方向。

在这种情况下,您需要从SurfaceTexure获取变换矩阵,应用额外的旋转以匹配您的应用UI,并将其设置为TextureView矩阵。

答案 1 :(得分:0)

我从事相机工作已经有一年了,所以我为缺乏细节而道歉。但我确实记得显示Camera预览时的关键是计算正确的变换矩阵以应用于SurfaceView(或TextureView)以应用所需的任何缩放或旋转。关于"谁正在轮换"我想你可以说它是视图,正如你提供的变换所指示的那样。因此,矩阵将基于您请求的预览分辨率(从您的设备的能力列表)与视图的实际布局尺寸的关系,以及设备传感器的物理方向与设备屏幕的当前方向进行比较。

在旧相机API中,Camera.CameraInfo有一个方向字段,用于提供安装传感器的物理方向。对于大多数手机上的风景安装传感器而言,它通常为90,但是你也会发现大约270个(有效地#34;倒置")。可能存在0和180但我从未见过它们。