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查看摄像头图像时会发现采集的摄像头数据是旋转过得

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

更多相关文章

  1. android EditText设置不可写
  2. android“设置”里的版本号
  3. 在Fragment中设置控件点击方法,执行失败。
  4. Android(安卓)闹钟管理类的使用
  5. Android设置通知栏/状态栏透明改变通知栏颜色和app最上部分颜色
  6. android 设置中划线 下划线等
  7. Andorid Dialog 示例【慢慢更新】
  8. android图表ichartjs
  9. Android(安卓)闹钟管理类的使用

随机推荐

  1. MySQL 如何分析查询性能
  2. mysql 8.0.24 安装配置方法图文教程
  3. 如何用Navicat操作MySQL
  4. MySQL EXPLAIN输出列的详细解释
  5. MySQL 分页查询的优化技巧
  6. MySql学习笔记之事务隔离级别详解
  7. MySQL 分组查询的优化方法
  8. JDBC连接的六步实例代码(与mysql连接)
  9. mysql查询优化之100万条数据的一张表优化
  10. MySQL索引知识的一些小妙招总结