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

e40259351f54

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();

e40259351f54

Screenshot_2017-11-02-18-02-21-79.png

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐