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. 使用 ASP.NET Core MVC 创建 Web API(五)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  2. ConcurrentDictionary并发字典知多少?

    背景 在上一篇文章你真的了解字典吗?一文中我介绍了Hash Function和字典的工作的基本原理. 有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题. https://doc ...

  3. windows代码,路径分割

    BOOL SplitPathName( PWSTR MyXbpathBuffer, wstring& wdrive, wstring& wdir, wstring& wfnam ...

  4. Dynamics CRM中跨域调用Web API 2

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复224或者20160611可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  5. Git 分支模型

    翻译自:https://nvie.com/posts/a-successful-git-branching-model/ 在这篇文章中,主要介绍 Git 分支模型.不会谈论任何项目的细节,只讨论分支策 ...

  6. Chrome启动后打开第一个网页很慢的解决方案

    Chrome启动后打开第一个网页很慢的解决方案 Chrome/Chromium以速度快著称,最近每当打开chrome的时候,打开第一个页面都非常慢,往往需要数十秒的时间,经分 析,应该是卡在了域名解析 ...

  7. sql sever insert into混合嵌套插入

    如果你想插入的字段取值方式不同,既有自己设定的值,又想插入某个表中的某个字段数据,下面就举例说明 insert into Meters(metertypeid, meternumber, consta ...

  8. windows之自动化在虚拟机部署操作系统并自带python环境

    (1)使用详情: **************************** *    操作说明     * **************************** 1.修改Config文件夹中的Se ...

  9. python3 购物车

    今天干了啥?喂了喂龟,看了看鱼... 然后就是学习了两个模块:sys模块和os模块,突然觉得python真的好,只要英语学的好,看代码超级舒服的说,嗯,我要好好学英语,今天背了几个啥,唉.写完博客再背 ...

  10. 数据库 【redis】 命令大全

    以下纯属搬砖,我用Python抓取的redis命令列表页内容 如果想看命令的具体使用可查去官网查看,以下整理为个人查找方便而已 地理位置GEOADD 将指定的地理空间位置(纬度.经度.名称)添加到指定 ...