简介
今天要给大家介绍如何在Android平台下获取采集的图像,并进行编码推流。同时项目工程也是在之前的代码基础上新增功能
QQ截图20171124114855.png
打开摄像头并设置参数
具体代码查看CameraActivity.java
private Camera getCamera() {
Camera camera;
try {
//打开相机,默认为后置,可以根据摄像头ID来指定打开前置还是后置
camera = Camera.open(1);
if (camera != null && !isPreview) {
try {
Camera.Parameters parameters = camera.getParameters();
//对拍照参数进行设置
for (Camera.Size size : parameters.getSupportedPictureSizes()) {
LogUtils.d(size.width + " " + size.height);
}
LogUtils.d("============");
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
LogUtils.d(size.width + " " + size.height);
}
parameters.setPreviewSize(screenWidth, screenHeight); // 设置预览照片的大小
parameters.setPreviewFpsRange(30000, 30000);
parameters.setPictureFormat(ImageFormat.NV21); // 设置图片格式
parameters.setPictureSize(screenWidth, screenHeight); // 设置照片的大小
camera.setParameters(parameters);
//指定使用哪个SurfaceView来显示预览图片
camera.setPreviewDisplay(sv.getHolder()); // 通过SurfaceView显示取景画面
camera.setPreviewCallback(new StreamIt()); // 设置回调的类
camera.startPreview(); // 开始预览
//Camera.takePicture()方法进行拍照
camera.autoFocus(null); // 自动对焦
} catch (Exception e) {
e.printStackTrace();
}
isPreview = true;
}
} catch (Exception e) {
camera = null;
e.printStackTrace();
Toast.makeText(this, "无法获取前置摄像头", Toast.LENGTH_LONG);
}
return camera;
}
Camera.open(int cameraId)
这里是创建一个Camera对象对应具体的硬件摄像头,如果摄像头已经被其他app打开,就会抛出RuntimeException异常。
cameraId是camera的Id。我们可以通过getNumberOfCameras()
获取摄像头的数量,那id的范围就是0~(getNumberOfCameras()-1)。一般情况下传0就直接获取到后置摄像头,1就获取到前置摄像头。当然有些设备可能有些不同。
Camera.Parameters
这个类用于存储和设置摄像头的参数信息,当然Camera有很多默认参数,所以我们只需要通过camera.getParameters()获取该对象,然后并设置我们需要修改的属性即可。我们看一些常见的属性设置
setPreviewSize
设置预览图像的大小
setPictureSize
设置照片的大小
setPreviewFpsRange
设置Fps,帧率。但我发现并没有什么卵用。每次修改后采集的频率还是没变,擦!
setPictureFormat
设置采集到图像的像素格式,Android推荐NV21。那我们就用这个,这个参数很重要,后面编码我们会详细讲解。
最后不要忘了调用setParameters进行设置。否则你就白忙活了。
预览和获取采集图像数据预览
第一个问题,用什么来承载预览图像。Android提供了SurfaceView和GLSurfaceView。这里为了方便大家上手,我们先选择使用SurfaceView稍微简单一点,对SurfaceView大家不熟的可以查找相关资料。接下来就是使用SurfaceView
布局中添加SurfaceView。这里我做了一个继承类MySurfaceView
获取SurfaceHolder并设置回调
SurfaceView里有一个SurfaceHolder用来控制SurfaceView的相关操作。比如设置SurfaceView的Callback,用来监听SurfaceView的创建,变化和销毁。这里只需要实现SurfaceHolder.Callback的接口
@Override public void surfaceCreated(SurfaceHolder holder) { setStartPreview(mCamera, mHolder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { setStartPreview(mCamera, mHolder); } @Override public void surfaceDestroyed(SurfaceHolder holder) { releaseCamera(); }
然后设置到SurfaceHolder中mHolder.addCallback(this)
SurfaceView与Camera关联
因为我们