-
重叠SurfaceView
在FrameLayout中重叠的两个surfaceview,在8.0以前是第一个定义的surfaceview处于window的最上层,会覆盖住第二个surfaceview。而8.0上则相反,不造为什么这么设计,网上没找到资料。
可以通过给其他一个surfaceview设置半屏的size就可以看哪个surfaceview在顶部。
通过SurfaceView.setZOrderMediaOverlay(true)可以强制某个SurfaceView显示在另一个的顶部 -
预览尺寸-容器尺寸-录制尺寸-编码尺寸的概念
预览尺寸 PreViewSize
指摄像头输出的预览帧的尺寸,由width 和height来表示
也就是onPreviewFrame里的尺寸
容器尺寸
展示预览帧的布局容器( SurfaceView/TextureView)的尺寸,需要和PreViewSize 比例一致,不然会预览会变形
录制尺寸 PictureSize
拍照的图片尺寸或者录视频时的视频帧尺寸,由width 和height来表示。
编码尺寸
生成和编码视频时,MediaFormat createVideoFormat(String mime, int width, int height)方法中的width和height值,决定最终生成的视频文件的尺寸。
所以,以上四个尺寸比例保持一致,就能保证预览的和最终生成的视频画面比例一致
-
屏幕方向
image
- 屏幕方向:android.view.Display.getRotation()
在锁定屏幕方向的状态下:均为0度。(推荐)
在开启屏幕自动旋转的状态下:自然握持状态下为0度,逆时针旋状依次为:90度、180度(有的手机没有这个角度)、270度;
- 相机图像方向:在 Camera 中对应的是android.hardware.Camera.CameraInfo.orientation ,在 Camera2 中对应的是 CameraCharacteristics.SENSOR_ORIENTATION。
一般情况下,后置相机的orientation是90,前置相机的orientation是270。也就是后置摄像头的照相机传感器顺时针旋转90度安装在手机的右上角:
image
官方网站推荐的预览方向适配代码:
//If you want to make the camera image show in the same orientation as the display, you can use the following code.
public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) {
//通过相机ID获得相机信息
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
//获得当前屏幕方向
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
//前置摄像头作镜像翻转
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
// 以屏幕方向为固定竖屏为例,后置摄像头的照相机传感器顺时针旋转90度安装在手机的右上角,
所以在传感器的角度看,观看世界的视角是逆时针旋转90的(info.orientation = 90,degrees = 0, result = 90)
所以顺时针旋转90了,视角就正了
camera.setDisplayOrientation(result);
}
参考:
Android Camera 踩坑
Android 相机预览方向及其适配探索
Android camera YUV NY21 数据裁剪
android Camera相关问题及NV12剪裁旋转
对android录制的NV21视频数据进行旋转(90,180,270)与剪切
Android 相机(一):摄像头属性,预览方向,预览尺寸等问题探究
保存视频流的YUV byte数组数据以及恢复:
Saving byte array using SharedPreferences
网友评论