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

Android视频录制从不入门到入门系列教程(四)————Camera Parameter的更多相关文章

  1. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

  2. Android视频录制从不入门到入门系列教程(三)————视频方向

    运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子 ...

  3. Android视频录制从不入门到入门系列教程(二)————显示视频图像

    1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> < ...

  4. 利用FFmpeg玩转Android视频录制与压缩(二)<转>

    转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...

  5. 办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时)

    办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时) 乔布斯的成功离不开美轮美奂的幻灯片效果,一个成功的商务人士.部门经理也少不了各种各样的PPT幻灯片.绿色资源网给你提供了 ...

  6. android视频录制、另一部手机实时观看方案

    最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...

  7. [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world

    [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...

  8. [大数据从入门到放弃系列教程]第一个spark分析程序

    [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...

  9. Android Studio系列教程四--Gradle基础

    Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...

随机推荐

  1. Linux iptables 配置规则

    Linux iptables 防火墙配置规则 前言:把网上我感觉不错iptables的访问规则都统一在这里,以后做参考. modprobe ipt_MASQUERADE modprobe ip_con ...

  2. Yii2设计模式——工厂方法模式

    应用举例 yii\db\Schema抽象类中: //获取数据表元数据 public function getTableSchema($name, $refresh = false) { if (arr ...

  3. canvas实现画板

    canvas实现画板 主要用到知识点: 鼠标事件onmousedown() onmousemove() onmouseup() onmouseleave() 事件委托 canvas的一些方法 如:绘制 ...

  4. Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{...

    转载请标明出处:https://www.cnblogs.com/tangZH/p/10764568.html 在做多渠道打包的时候出现了这个错误,在高版本的gradle出现. 具体错误为:Cannot ...

  5. Redis入门教程(二)

    推荐阅读: Redis入门教程(一)https://www.cnblogs.com/jichi/p/10285346.html 5. Redis 的数据结构 5.1 Redis 数据结构介绍 redi ...

  6. .NET+PostgreSQL实践与避坑指南

    简介 .NET+PostgreSQL(简称PG)这个组合我已经用了蛮长的一段时间,感觉还是挺不错的.不过大多数人说起.NET平台,还是会想起跟它“原汁原味”配套的Microsoft SQL Serve ...

  7. 使用WSL吧

    WSL(Windows Subsystem for Linux)已经装在电脑上好一阵子了,谁如果还没装的,可以看看本文,至少知道个大概,觉得有用的话知道该如何做. 简介 WSL简单说就是一个能让你在W ...

  8. 使用清华开源镜像安装tensorflow

    安装tensorflow时,如果使用直接安装速度相对较慢,采取清华大学的镜像会提高速度.GPU版本安装方法:pip install tensorflow-gpu==1.8 -i https://pyp ...

  9. 查看网卡及对应的IP、MAC

    #!/bin/bash# judge OS OS_release=`cat /etc/redhat-release | awk '{print $(NF-1)}'|cut -c 1`# To obta ...

  10. python安装第三方库报错visual c++ 14.0 is required

    使用python安装第三方库时报错如下: error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ ...