安卓视频相关

  1. 重叠SurfaceView
    在FrameLayout中重叠的两个surfaceview,在8.0以前是第一个定义的surfaceview处于window的最上层,会覆盖住第二个surfaceview。而8.0上则相反,不造为什么这么设计,网上没找到资料。
    可以通过给其他一个surfaceview设置半屏的size就可以看哪个surfaceview在顶部。
    通过SurfaceView.setZOrderMediaOverlay(true)可以强制某个SurfaceView显示在另一个的顶部

  2. 预览尺寸-容器尺寸-录制尺寸-编码尺寸的概念

预览尺寸 PreViewSize

指摄像头输出的预览帧的尺寸,由width 和height来表示
也就是onPreviewFrame里的尺寸

容器尺寸

展示预览帧的布局容器( SurfaceView/TextureView)的尺寸,需要和PreViewSize 比例一致,不然会预览会变形

录制尺寸 PictureSize

拍照的图片尺寸或者录视频时的视频帧尺寸,由width 和height来表示。

编码尺寸

生成和编码视频时,MediaFormat createVideoFormat(String mime, int width, int height)方法中的width和height值,决定最终生成的视频文件的尺寸。

所以,以上四个尺寸比例保持一致,就能保证预览的和最终生成的视频画面比例一致

  1. 屏幕方向


    安卓视频相关_第1张图片
    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度安装在手机的右上角:


安卓视频相关_第2张图片
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

用yuv viewer查看yuv数据的格式:

https://www.jb51.net/softs/641898.html

你可能感兴趣的:(安卓视频相关)