android rtmp推流直播学习(一)----视频采集

android直播离不开源数据采集,在此就对于视频采集的方法稍作记录

1.权限

android 开启视频采集需要摄像头权限


同事需要声明依赖的外部的硬件或软件,使用摄像头时必须开启设备的摄像头
所以需要配置:

    
    

2.初始化Camera

Camera是android获取摄像头源数据的类,使用方式

a.初始化:

Camera mCamera = Camera.open();

打开Camera 的方法有两种方式,一种是无参的Camera.open(),有源码:

    public static Camera open() {
        int numberOfCameras = getNumberOfCameras();
        CameraInfo cameraInfo = new CameraInfo();
        for (int i = 0; i < numberOfCameras; i++) {
            getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
                return new Camera(i);
            }
        }
        return null;
    }

可以看出默认是初始化后置摄像头,如果检测不到后置摄像头,初始化失败
另一种是传入设想头参数:

CameraInfo.CAMERA_FACING_BACK //后置摄像头
CameraInfo.CAMERA_FACING_FRONT//前置摄像头

b.设置摄像头采集分辨率

现获取相机参数设置生效类

Camera.Parameters parameters = mCamera.getParameters();

设置采集分辨率

parameters.setPreviewSize(int width, int height)

这里需要注意,分辨率的宽高不是随便设置的,只能设置此机器支持的分辨率,如何获取此机器的分辨率:

List sizes = parameters.getSupportedPreviewSizes();
        for(Camera.Size size :sizes){
            int width = size.width;
            int height = size.height;
        }

c.设置视频采集格式

android视频采集格式一般为nv21,及yuv420sp,方便转换成可编码的yuv420p格式数据,两者的差别可查看:http://www.jianshu.com/p/7dcaec0b2286
设置方法:

parameters.setPreviewFormat(ImageFormat.NV21);

将设置的相机参数生效:

mCamera.setParameters(parameters);

d.旋转查看

当设置SurfaceHolder查看摄像头图像时会发现采集的摄像头数据是旋转过得

android rtmp推流直播学习(一)----视频采集_第1张图片
Screenshot_2017-11-02-17-59-38-53.png

此时想要以采集的角度正确查看需要旋转:

    private static void setCameraDisplayOrientation(Activity activity, int cameraId, Camera camera) {
        Camera.CameraInfo info =
                new Camera.CameraInfo();
        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;
        }
        camera.setDisplayOrientation(result);
    }

SurfaceHolder设置方式:

mCamera.setPreviewDisplay(SurfaceHolder holder)

e.获取采集数据接口

        mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] bytes, Camera camera) {

            }
        });

源数据将通过此接口获取

f.开启摄像头

当前面的参数都设置完后,通过此方法开启摄像头:

mCamera.startPreview();
Screenshot_2017-11-02-18-02-21-79.png

软编码+硬编码+ffmpeg+rtmp推流demo

你可能感兴趣的:(android rtmp推流直播学习(一)----视频采集)