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. Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

    前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spr ...

  2. Go map实现原理

    map结构 整体为一个数组,数组每个元素可以理解成一个槽,槽是一个链表结构,槽的每个节点可存8个元素,搞清楚了map的结构,想想对应的增删改查操作也不是那么难

  3. go.js remove 特定part

    我想删除一个实际上是背景的部分. 假设这是我添加part的方式 myDiagram.add( scope.gj(go.Part,//此Part未绑定到任何模型数据 { layerName:“Backg ...

  4. HTML基础系列

    HTML标记语言,网页制作的第一步. 什么是HTML呢?查百度 基础语法 常用标签 HTML是超文本标记语言,HTML不用编译,直接在浏览器中执行,HTML是一个文本文件. HTML基本结构,标签,元 ...

  5. [ArcGIS API for JavaScript 4.8] Sample Code-Popups-1-popupTemplate的概念和popup中属性字段值的多种表现形式

    [官方文档:https://developers.arcgis.com/javascript/latest/sample-code/intro-popuptemplate/index.html] 一. ...

  6. 第八周LINUX学习笔记

    vsftpd丶NFS丶SAMBA nfs基于rpcsamba基于cifs(smb)  DRBD: ftp:File Transfer protocol 文件传输协议 两个连接:       tcp:命 ...

  7. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  8. C#版[击败99.69%的提交] - Leetcode 242. 有效的同构异形词 - 题解

    C#版 - Leetcode 242. 有效的同构异形词 - 题解 Leetcode 242.Valid Anagram 在线提交: https://leetcode.com/problems/val ...

  9. java~gradle构建公用包并上传到仓库~使用私有仓库的包

    在新的项目里使用仓库的包 上一讲中我们说了java~gradle构建公用包并上传到仓库,如何发布公用的非自启动类的包到私有仓库,而这一讲我们将学习如何使用这些包,就像我们使用spring框架里的功能包 ...

  10. c# 获取当前时间的微秒

    获取毫秒大家都经常用到. 大家应该都知道怎么用. 但是,毫秒下面还有微秒. 其实这个方法也已经在c#中. 只不过很少有人用到,所以查找资料也很少有人说. 下面代码就是获取微秒的方式: DateTime ...