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查看摄像头图像时会发现采集的摄像头数据是旋转过得
此时想要以采集的角度正确查看需要旋转:
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();
软编码+硬编码+ffmpeg+rtmp推流demo