Android视频录制从不入门到入门系列教程(四)————Camera Parameter
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的更多相关文章
- Android视频录制从不入门到入门系列教程(一)————简介
一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...
- Android视频录制从不入门到入门系列教程(三)————视频方向
运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子 ...
- Android视频录制从不入门到入门系列教程(二)————显示视频图像
1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> < ...
- 利用FFmpeg玩转Android视频录制与压缩(二)<转>
转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...
- 办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时)
办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时) 乔布斯的成功离不开美轮美奂的幻灯片效果,一个成功的商务人士.部门经理也少不了各种各样的PPT幻灯片.绿色资源网给你提供了 ...
- android视频录制、另一部手机实时观看方案
最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...
- [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world
[大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...
- [大数据从入门到放弃系列教程]第一个spark分析程序
[大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...
- Android Studio系列教程四--Gradle基础
Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...
随机推荐
- 一文带你认识Spring事务
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y Spring事务管理我相信大家都用得很多,但可能仅仅 ...
- Node 框架接入 ELK 实践总结
本文由云+社区发表 作者:J2X 我们都有过上机器查日志的经历,当集群数量增多的时候,这种原始的操作带来的低效率不仅给我们定位现网问题带来极大的挑战,同时,我们也无法对我们服务框架的各项指标进行有效的 ...
- Spring Boot入门(二):使用Profile实现多环境配置管理&如何获取配置文件值
在上一篇博客Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件中,我们新建了一个最原始的Spring Boot项目,并使用了更为流行的yaml配置文件. ...
- 基于Servlet+jsp的web计算器
基于Servlet+jsp的web计算器 这次老大为了让我们自己复习web中页面的跳转给布置得任务 天下代码一大抄,关键看你怎么抄 首先我想到的计算算法不是什么堆栈,是简单的(其实很复杂,但是我就只需 ...
- [Android 除錯] Conflict with dependency
Android Studio build 時的錯誤訊息 : Conflict with dependency 詳細錯誤訊息 : Conflict with dependency 'com.androi ...
- SQL Server关于predicate、density、selectivity、cardinality名词浅析
在SQL Server中,我们要看懂执行计划和统计信息,我们可能需要深刻理解一些关键词,例如密度(Density).选择性(Selectivity).谓词(predicate).基数(Cardin ...
- linux 进程概念
1,pcb:进程控制块结构体:/usr/src/linux-headers-4.15.0-29/include/linux/sched.h 进程id:系统中每个进程有唯一的id,在c语言中用pid_t ...
- SUSE12SP3-Zookeeper安装
直接使用root账号 1.zookeeper安装 将zookeeper-3.4.13.tar.gz安装包放置指定目录 sudo tar -zxvf zookeeper-3.4.13.tar.gz -C ...
- #Java学习之路——基础阶段二(第七篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它
本文介绍如何保护API,无需看前边文章也能明白吧. 预备知识: http://www.cnblogs.com/cgzl/p/9010978.html http://www.cnblogs.com/cg ...