Camera提供了一个叫做setParameters的方法帮助开发者设置相机的相关参数。
通过Camera的getParameters方法可以获取到当前为相机设置的相关参数。
下面简单介绍下,视频录制会用到的几个参数的用法。
一、设置PreviewSize,即视频预览大小,也即输出到SurfaceView的视频图片的分辨率大小。
需要注意的是,PreviewSize只有那么有限的几种,各个手机的值也不近相同,不是随便传进去个Size都行的。当然你非得随便搞个Size传进去,编译时不会出现任何问题,只是运行时会抛出一个异常,告诉你这个参数不被接受。
通常,在设置PreviewSize之前,需要调用getSupportedPreviewSizes来获取Camera支持的Size列表。非常不推荐设置一个固定的Size,因为会导致在其他Android手机上由于不支持这个Size导致程序异常的问题。
下面的代码打印出了本手机支持的所有PreviewSize:
Camera.Parameters parameters = camera.getParameters(); List<Camera.Size> previewSizeList = parameters.getSupportedPreviewSizes(); for (int i = 0; i < previewSizeList.size(); i++) { Camera.Size size = previewSizeList.get(i); Log.i("PREVIEW_SIZE", String.format("camera preview width=%d,height=%d",size.width,size.height)); }
在我的手机上输出如下:
camera preview width=1920,height=1080 camera preview width=1440,height=1080 camera preview width=3840,height=2160 camera preview width=1280,height=720 camera preview width=960,height=720 camera preview width=864,height=480 camera preview width=800,height=480 camera preview width=768,height=432 camera preview width=720,height=480 camera preview width=640,height=480 camera preview width=576,height=432 camera preview width=176,height=144 camera preview width=480,height=320 camera preview width=384,height=288 camera preview width=352,height=288 camera preview width=240,height=160 camera preview width=320,height=240
可以看到,其宽高比以16:9和4:3为主。请注意,结合上篇文章说到的,这些宽高比都是横向的宽高比,这里的width对应的是手机屏幕的height,这里的height对应手机屏幕的width。
二、设置FPS,即视频预览帧率。
同样的,FPS的值也只有有限的几种,我们可以通过getSupportedPreviewFpsRange获取手机支持的预览FPS。
下面的代码打印出了本手机支持的所有Fps:
List<int[]> fpsList = parameters.getSupportedPreviewFpsRange(); for (int i = 0; i < fpsList.size(); i++) { int[] fps = fpsList.get(i); Log.i("FPS", String.format("camera preview fps min=%d,max=%d",fps[0],fps[1])); }
在我的手机上输出如下:
camera preview fps min=7500,max=30000 camera preview fps min=8000,max=30000 camera preview fps min=30000,max=30000
我测试过很多手机,最大帧率几乎都是30FPS。不过对于移动端的短视频录制,24-30FPS都可以接受。
三、设置对焦模式
通过getSupportedFocusModes()可以获取到手机支持的对焦模式。
下面的代码打印出了本手机支持的所有FocusMode:
List<String> focusModeList = parameters.getSupportedFocusModes(); for (int i = 0; i < focusModeList.size(); i++) { String focusMode = focusModeList.get(i); Log.i("FOCUS_MODE", String.format("camera focusMode=%s",focusMode)); }
在我的手机上输出如下:
camera focusMode=auto camera focusMode=infinity camera focusMode=macro camera focusMode=continuous-video camera focusMode=continuous-picture camera focusMode=manual
这几个单词都不复杂,对于移动短视频录制来说,使用的对焦模式应该是continuous-video。这个模式会在录制过程中自动对焦,默认对焦点为Camera坐标系的原点。Camera坐标系后面会说到。
值得一提的是,不是所有的手机都支持continuous-video,如果你的项目需要对那些不支持连续对焦模式的手机也要实现连续对焦的功能,通常有下面几种途径:
- 图像识别,大意就是通过各种XX算法判断当前帧是否已对焦。
- 定时器对焦,大意就是整个计时器,每过一定时间就让Camera对焦一次。
- 传感器,通过Android提供的各种传感器来判断手机是否有过移动,进而实现连续对焦。
图像识别这个办法我是没有任何建议,我也玩不来这么高逼格的东西,后面会有一片文章通过结合第二和第三种来实现连续自动对焦,效果差强人意。
最后,还有两个可能对短视频有用的设置。
开启HDR:
if (parameters.getSupportedSceneModes().contains(Camera.Parameters.SCENE_MODE_HDR)) { parameters.setSceneMode(Camera.Parameters.SCENE_MODE_HDR); }
开启防抖动:
if (parameters.isVideoStabilizationSupported()) { parameters.setVideoStabilization(true); }