android 自定义Cameraandroid 触摸对焦焦怎么实现

实现Android手机摄像头的自动对焦 - OPEN代码分享
如何实现Android相机的自动对焦,而且是连续自动对焦的。当然直接调用系统相机就不用说了,那个很简单的。下面我们主要来看看如如何自己实现一个相机,并且实现自动连续对焦。
代码如下:
public class MainActivity extends Activity {
private SurfaceView surfaceV
private SurfaceHolder surfaceH
private boolean flag =
private String fileUrl=&&;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView =
(SurfaceView) findViewById(R.id.surfaceView1);
button=(Button) findViewById(R.id.takepicture);
surfaceHolder =
surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.setKeepScreenOn(true);
surfaceView.setFocusable(true);
surfaceView.setBackgroundColor(TRIM_MEMORY_BACKGROUND);
surfaceHolder.addCallback(new Callback() {
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera.stopPreview();
camera.release();
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(null==camera){
camera=Camera.open();
camera.setPreviewDisplay(surfaceHolder);
initCamera();
camera.startPreview();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
//实现自动对焦
camera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
if(success){
initCamera();//实现相机的参数初始化
camera.cancelAutoFocus();//只有加上了这一句,才会自动对焦。
//相机参数的初始化设置
private void initCamera()
parameters=camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
//parameters.setPictureSize(surfaceView.getWidth(), surfaceView.getHeight());
// 部分定制手机,无法正常识别该方法。
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//1连续对焦
setDispaly(parameters,camera);
camera.setParameters(parameters);
camera.startPreview();
camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
//控制图像的正确显示方向
private void setDispaly(Camera.Parameters parameters,Camera camera)
if (Integer.parseInt(Build.VERSION.SDK) &= 8){
setDisplayOrientation(camera,90);
parameters.setRotation(90);
//实现的图像的正确显示
private void setDisplayOrientation(Camera camera, int i) {
Method downP
downPolymorphic=camera.getClass().getMethod(&setDisplayOrientation&, new Class[]{int.class});
if(downPolymorphic!=null) {
downPolymorphic.invoke(camera, new Object[]{i});
catch(Exception e){
Log.e(&Came_e&, &图像出错&);
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
&&您还没有登录,点击这里或之后才能回复!
浏览数: 553
分享时间: 3 个月 前[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现 - candycat
- 博客频道 - CSDN.NET
9382人阅读
写在前面最近在从零开始写一个移动端的AR系统,坑实在是太多了!!!整个项目使用了OpenCV第三方库,但对于摄像机来说,和原生Camera的方法基本相同。实现以OpenCV的JavaCameraView为例,首先需要定制自己的Camera,主要代码如下:import java.util.ArrayL
import java.util.L
import org.opencv.android.JavaCameraV
import android.R.
import android.content.C
import android.graphics.R
import android.graphics.RectF;
import android.hardware.C
import android.hardware.Camera.AutoFocusC
import android.util.AttributeS
import android.view.MotionE
import android.widget.T
public class MTCameraView extends JavaCameraView implements AutoFocusCallback {
public MTCameraView(Context context, int attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
public List&Camera.Size& getResolutionList() {
mCamera.getParameters().getSupportedPreviewSizes();
public Camera.Size getResolution() {
Camera.Parameters params = mCamera.getParameters();
Camera.Size s = params.getPreviewSize();
public void setResolution(Camera.Size resolution) {
disconnectCamera();
connectCamera((int)resolution.width, (int)resolution.height);
public void focusOnTouch(MotionEvent event) {
Rect focusRect = calculateTapArea(event.getRawX(), event.getRawY(), 1f);
Rect meteringRect = calculateTapArea(event.getRawX(), event.getRawY(), 1.5f);
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
if (parameters.getMaxNumFocusAreas() & 0) {
List&Camera.Area& focusAreas = new ArrayList&Camera.Area&();
focusAreas.add(new Camera.Area(focusRect, 1000));
parameters.setFocusAreas(focusAreas);
if (parameters.getMaxNumMeteringAreas() & 0) {
List&Camera.Area& meteringAreas = new ArrayList&Camera.Area&();
meteringAreas.add(new Camera.Area(meteringRect, 1000));
parameters.setMeteringAreas(meteringAreas);
mCamera.setParameters(parameters);
mCamera.autoFocus(this);
* Convert touch position x:y to {@link Camera.Area} position - to .
private Rect calculateTapArea(float x, float y, float coefficient) {
float focusAreaSize = 300;
int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();
int centerX = (int) (x / getResolution().width * 2000 - 1000);
int centerY = (int) (y / getResolution().height * 2000 - 1000);
int left = clamp(centerX - areaSize / 2, -);
int right = clamp(left + areaSize, -);
int top = clamp(centerY - areaSize / 2, -);
int bottom = clamp(top + areaSize, -);
return new Rect(left, top, right, bottom);
private int clamp(int x, int min, int max) {
if (x & max) {
if (x & min) {
public void setFocusMode (Context item, int type){
Camera.Parameters params = mCamera.getParameters();
List&String& FocusModes = params.getSupportedFocusModes();
switch (type){
if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
Toast.makeText(item, &Auto Mode not supported&, Toast.LENGTH_SHORT).show();
if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
Toast.makeText(item, &Continuous Mode not supported&, Toast.LENGTH_SHORT).show();
if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_EDOF))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_EDOF);
Toast.makeText(item, &EDOF Mode not supported&, Toast.LENGTH_SHORT).show();
if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);
Toast.makeText(item, &Fixed Mode not supported&, Toast.LENGTH_SHORT).show();
if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
Toast.makeText(item, &Infinity Mode not supported&, Toast.LENGTH_SHORT).show();
if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_MACRO))
params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
Toast.makeText(item, &Macro Mode not supported&, Toast.LENGTH_SHORT).show();
mCamera.setParameters(params);
public void setFlashMode (Context item, int type){
Camera.Parameters params = mCamera.getParameters();
List&String& FlashModes = params.getSupportedFlashModes();
switch (type){
if (FlashModes.contains(Camera.Parameters.FLASH_MODE_AUTO))
params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
Toast.makeText(item, &Auto Mode not supported&, Toast.LENGTH_SHORT).show();
if (FlashModes.contains(Camera.Parameters.FLASH_MODE_OFF))
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
Toast.makeText(item, &Off Mode not supported&, Toast.LENGTH_SHORT).show();
if (FlashModes.contains(Camera.Parameters.FLASH_MODE_ON))
params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
Toast.makeText(item, &On Mode not supported&, Toast.LENGTH_SHORT).show();
if (FlashModes.contains(Camera.Parameters.FLASH_MODE_RED_EYE))
params.setFlashMode(Camera.Parameters.FLASH_MODE_RED_EYE);
Toast.makeText(item, &Red Eye Mode not supported&, Toast.LENGTH_SHORT).show();
if (FlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH))
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
Toast.makeText(item, &Torch Mode not supported&, Toast.LENGTH_SHORT).show();
mCamera.setParameters(params);
public void onAutoFocus(boolean arg0, Camera arg1) {
在MainActivity中需要初始化MTCamera,并且实现OnTouchListener接口,以便在触摸屏幕时可以调用onTouch函数。其中主要代码如下: private MTCameraView mOpenCvCameraV
public void init() {
mOpenCvCameraView = new MTCameraView(this, -1);
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.setFocusable(true);
mOpenCvCameraView.setOnTouchListener(MainActivity.this);
mOpenCvCameraView.enableView();
FrameLayout frame = new FrameLayout(this);
frame.addView(mOpenCvCameraView);
setContentView(frame);
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
mOpenCvCameraView.focusOnTouch(arg1);
}init()函数是自定义的初始化函数,可以在onCreate时使用。由于这里需要使用OpenCV库,所以本项目是在加载完OpenCV库并判断成功后才调用init()函数的。解释在发生触摸事件时,MainActivity由于实现了OnTouchListener接口,因此会调用重写的onTouch函数,并把它的第二个参数MotionEvent传递给MTCamera,以便定位触摸位置。MTCamera的focusOnTouch函数继续工作。它首先根据触摸位置计算对焦和测光(metering)区域的大小(通过calculateTapArea函数),然后创建新的Camera.Parameters,并设置摄像机的对焦模式为Auto。然后,它分别判断该设备的相机是否支持设置对焦区域和测光区域,如果支持就分别为parameters设置之前计算好的聚焦和测光区域。最后,让Camera自动对焦。calculateTapArea函数这个函数主要实现从屏幕坐标系到对焦坐标系的转换。由MotionEvent.getRowX()得到的是以屏幕坐标系(即屏幕左上角为原点,右下角为你的当前屏幕分辨率,单位是一个像素)为准的坐标,而setFocusAreas接受的List&Area&中的每一个Area的范围是(-1000,-1000)到(1000, 1000),也就是说屏幕中心为原点,左上角为(-1000,-1000),右下角为()。注意,如果超出这个范围的话,会报setParemeters failed的错误哦!除此之外,我们还提前定义了一个对焦框(测光框)的大小,并且接受一个参数(第三个参数coefficient)作为百分比进行调节。至此完成了触摸对焦的功能。但是,可以发现MTCamera里还有很大部分代码,主要是两个函数setFocusMode和setFlashMode。这两个函数,主要是因为在项目中我的图像经常是模糊的,但不知道系统支持那么对焦模式。这时,就可以使用这两个函数进行测试。这还需要在MainActivity中添加菜单栏的代码,以便进行选择。代码如下:
private List&Camera.Size& mResolutionL
private MenuItem[] mResolutionMenuI
private MenuItem[] mFocusListI
private MenuItem[] mFlashListI
private SubMenu mResolutionM
private SubMenu mFocusM
private SubMenu mFlashM
public boolean onCreateOptionsMenu(Menu menu) {
Log.i(TAG, &called onCreateOptionsMenu&);
List&String& mFocusList = new LinkedList&String&();
int idx =0;
mFocusMenu = menu.addSubMenu(&Focus&);
mFocusList.add(&Auto&);
mFocusList.add(&Continuous Video&);
mFocusList.add(&EDOF&);
mFocusList.add(&Fixed&);
mFocusList.add(&Infinity&);
mFocusList.add(&Makro&);
mFocusList.add(&Continuous Picture&);
mFocusListItems = new MenuItem[mFocusList.size()];
ListIterator&String& FocusItr = mFocusList.listIterator();
while(FocusItr.hasNext()){
// add the element to the mDetectorMenu submenu
String element = FocusItr.next();
mFocusListItems[idx] = mFocusMenu.add(2,idx,Menu.NONE,element);
List&String& mFlashList = new LinkedList&String&();
mFlashMenu = menu.addSubMenu(&Flash&);
mFlashList.add(&Auto&);
mFlashList.add(&Off&);
mFlashList.add(&On&);
mFlashList.add(&Red-Eye&);
mFlashList.add(&Torch&);
mFlashListItems = new MenuItem[mFlashList.size()];
ListIterator&String& FlashItr = mFlashList.listIterator();
while(FlashItr.hasNext()){
// add the element to the mDetectorMenu submenu
String element = FlashItr.next();
mFlashListItems[idx] = mFlashMenu.add(3,idx,Menu.NONE,element);
mResolutionMenu = menu.addSubMenu(&Resolution&);
mResolutionList = mOpenCvCameraView.getResolutionList();
mResolutionMenuItems = new MenuItem[mResolutionList.size()];
ListIterator&Camera.Size& resolutionItr = mResolutionList.listIterator();
while(resolutionItr.hasNext()) {
Camera.Size element = resolutionItr.next();
mResolutionMenuItems[idx] = mResolutionMenu.add(1, idx, Menu.NONE,
Integer.valueOf((int) element.width).toString() + &x& + Integer.valueOf((int) element.height).toString());
public boolean onOptionsItemSelected(MenuItem item) {
Log.i(TAG, &called onOptionsItemS selected item: & + item);
if (item.getGroupId() == 1)
int id = item.getItemId();
Camera.Size resolution = mResolutionList.get(id);
mOpenCvCameraView.setResolution(resolution);
resolution = mOpenCvCameraView.getResolution();
String caption = Integer.valueOf((int) resolution.width).toString() + &x& + Integer.valueOf((int) resolution.height).toString();
Toast.makeText(this, caption, Toast.LENGTH_SHORT).show();
else if (item.getGroupId()==2){
int focusType = item.getItemId();
mOpenCvCameraView.setFocusMode(this, focusType);
else if (item.getGroupId()==3){
int flashType = item.getItemId();
mOpenCvCameraView.setFlashMode(this, flashType);
}这样运行后,点击菜单就可以看见有三个菜篮列表:Focus(对焦模式),Flash(视频模式),Resolution(支持的分辨率)。对焦模式和视频模式中提供了几种常见的模式供选择,代码会判断当前设备是否支持该模式。而分辨率菜单栏会显示出当前设备支持的所有分辨率种类。参考
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:398195次
积分:5785
积分:5785
排名:第1773名
原创:98篇
转载:20篇
译文:21篇
评论:896条
我叫乐乐,程序媛一枚,就读于上海交通大学软件学院,研究生,数字媒体方向。感兴趣的领域有人机交互,增强现实,游戏等等啦,我喜欢新奇好玩绚丽的东西和技术~
邮件:lelefeng1992 # gmail DOT com
PS:为防止垃圾邮件,请自行转换为正确格式哦~
阅读:12922
阅读:4800
文章:45篇
阅读:168302
(1)(4)(2)(3)(6)(3)(8)(5)(6)(3)(6)(5)(7)(1)(2)(8)(1)(4)(5)(4)(3)(15)(2)(3)(27)(5)后使用快捷导航没有帐号?
Camera FV-5软件评测 用了它之后Mate7拍起照来自己都害怕!
&已臻大成&
来自:浏览器
最新回复 7&小时前
本帖最后由 水手的手 于
17:08 编辑
大家都知道,Mate的拍照效果是非常好的。不过在拍照设置方面,相对简单一点。当然了,在日常生活中,我们用到做多的肯定是智能拍照模式。因为很多场景没有时间去设置。不过我相信很多花粉也都是搞机的高手,自然不会满足于最基础的玩法。今天楼主就给大家介绍一款相机软件,让Mate7的拍照更上一层楼!
Screenshot_-10-56-43.jpeg (65.83 KB, 下载次数: 10)
11:06 上传
截图中红框的位置,有两个APP,一个叫做:Camera FV-5,另一个叫做:全能相机。鉴于两款一起介绍的话,会导致贴子变的非常长,不方便大家阅读!今天就给大家介绍第一款软件吧——Camera FV-5
Screenshot_-11-34-28.jpeg (28.38 KB, 下载次数: 10)
11:35 上传
Camera FV-5为尽可能接近传统单反相机而设计,因此所有摄影参数如单反上的硬件按钮一样,可以在触摸屏幕与上控制。如果您之前已经在使用传统单反相机,您会很容易上手。这就是拍照界面!怎么样,看起来是不是比较专业的感觉?没错,在网上大家对他的评价,就是比较专业!
F2.0:光圈。此项进攻参考,由于Android移动设备的光圈是固定的,因此不能被调整。
1/40:曝光时间。这里显示所使用的曝光时间,显示为秒,或以以10步进的长时间曝光。
ISO 320:ISO值(感光度)。这里显示所选的ISO值,或自动,
[2057]:存储卡中的剩余拍摄张数。这是一个近似值,是根据所选择的储存介质、照片的分辨率和图像格式(JPEG或PNG)计算出的剩余拍摄张数。在某些设备当中会较其他更准确,因为不同硬件设备对相同图像质量的JPG压缩大小不同。
+0:缓存中的照片。在您不断的进行相机操作和拍摄照片是,之前拍摄的的照片会同时在后台进行处理。拍照时,图片会被存储在缓存中,并且它们的一个接一个在后台处理。如果有足够的RAM,RAW格式照片会存储到RAM中进行处理。当没有更多的可用RAM时,系统会使用内部记忆体来储存待处理的图片。因此,在缓冲器中的图片数量依赖于RAM的大小。 RAM通常可以存储大约2-3张照片,而内部存储器可以装下上百张。如果您关闭摄像头应用程序,再次打开时看到此项有数字显示,说明Camera FV-5在缓存中处理上次未完成的图片。
1、AWB——白平衡。
360手机助手截图_01.png (77.5 KB, 下载次数: 9)
11:48 上传
这个功能,Mate7自带的相机也有,只不过隐藏的比较深,在拍摄的时候调出不是很方便。白平衡的基本概念是“不管在任何光源下,都能将白色物体还原为白色”,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿。各种白平衡下的照片所产生的偏色显示出补偿时的补色。这里提供了多云、晴天、白炽灯、荧光灯几种情景模式,总体来说和Mate7自带的区别不大。
2、AF——对焦模式。可以选择以下对焦模式,和对焦锁定开关。
360手机助手截图_01.png (90.62 KB, 下载次数: 10)
11:57 上传
自动对焦:在屏幕上的任意位置对焦。对焦优先级取决于相机制造商。点击取景器上的任意位置完成对焦。
微距:优先近处的物体的自动对焦。在某些设备上,有效地降低了所允许的最小对焦距离。
触摸对焦:点哪里对焦哪里。
无穷远对焦:将焦点设置到无限远。
自动对焦锁:将焦点锁定在当前位置。再次点击切换到解锁。
3、测光模式
360手机助手截图_01.png (83.4 KB, 下载次数: 11)
12:05 上传
矩阵测光:全区域平均测光。
中心重点测光:以中心点区域为参考测光。
点测光:以中心点为参考测光。
自动曝光锁:锁定当前曝光值
4、ISO调节
360手机助手截图_02.png (75.32 KB, 下载次数: 10)
14:07 上传
数码相机的感光度是一种类似于胶卷感光度的一种指标,实际上,数码相机的ISO是通过调整感光器件的灵高感光度相片的相片质量对照敏度或者合并感光点来实现的,也就是说是通过提升感光器件的光线敏感度或者合并几个相邻的感光点来达到提升ISO的目的。大家需要注意的是,Mate7自带相机的ISO调节,最高只能到800。
5、曝光补偿
360手机助手截图_03.png (58.08 KB, 下载次数: 10)
14:07 上传
曝光补偿是一种曝光控制方式,一般常见在±2-3EV左右,如果环境光源偏暗,即可增加曝光值(如调整为+1EV、+2EV)以突显画面的清晰度。曝光补偿就是有意识地变更相机自动演算出的“合适”曝光参数,让照片更明亮或者更昏暗的拍摄手法。
1、基本设置
1.jpg (5.62 KB, 下载次数: 10)
14:24 上传
右侧的这个图标,就是设置图标。本款软件的设置非常多,我就不挨个展开了,只介绍一个实用的功能吧,这也是Mate7自带相机没有的。那就是——构图网格。
360手机助手截图_01.png (91.31 KB, 下载次数: 9)
14:31 上传
在取景器设置中,就有构图网格选项了!
360手机助手截图_01.png (79.5 KB, 下载次数: 9)
14:31 上传
大家可以根据自己的爱好,来选用构图网格,非常方便
2、程序模式,单击切换
360手机助手截图_01.png (124.43 KB, 下载次数: 11)
14:37 上传
程序自动(P):系统自动设置曝光时间(光圈是固定的)。
快门优先(s):可手动设置曝光时间。
3、闪光灯模式:自定义闪光模式
360手机助手截图_02.png (133.62 KB, 下载次数: 10)
14:50 上传
这个就不细说了,大家都懂的!
以上给大家介绍了半天,到最终还是要用照片来说话!
游客,如果您要查看本帖隐藏内容请
总结:Camera FV-5不愧是网友一直认可的专业软件,诸多参数可以自由设置,可以让用户体会到手动操作的快感。如果你是一个手机拍照狂,楼主我非常推荐这款软件。而Mate7自带的软件则相对简单,将更多的设置融入到智能拍照中,让用户更轻松的得到自己满意的照片。并且经过算法的优化,将照片大小压缩的很小,这样可以存储的更多。好了,今天忙活一天,就给写了这一篇文章,大家有什么想说的,欢迎回复,我们一起讨论。
拜托,楼主和我说的都是传统单反!&
花粉俱乐部真心感谢您m( _ _ )m.
我只想做一个安静的美男子!
width:100%">
&热心花粉&
来自:浏览器
感谢楼主的分享!
width:100%">
&略有小成&
来自:浏览器
看看实际效果再说
width:100%">
&初窥门径&
来自:浏览器
看看看看看
width:100%">
&登堂入室&
来自:浏览器
这个看起来像是推广啊
width:100%">
&略有小成&
来自:浏览器
width:100%">
&略有小成&
来自:浏览器
width:100%">
&炉火纯青&
来自:浏览器
楼主辛苦下,把全能相机的再写出来就好了
width:100%">
&独步江湖&
来自:浏览器
真有敢说的,接近传统单反设计?传统单反有液晶屏吗?能跟卡片机一样就很了不起了。
另,记得不清楚了,FV-5完整版是不是要收费的?
谁告诉你单反没液晶屏,你看现在哪个单反没液晶屏&
width:100%">
&已臻大成&
来自:浏览器
感谢楼主的分享!
感谢回复!我会努力的!
我只想做一个安静的美男子!
width:100%">
好基友勋章
花粉好机友,注册时间大于99天
申请成为热心花粉,满足热心花粉条件即可获得!http://cn./forum.php?mod=viewthread&tid=183642
1000万花粉
纪念花粉俱乐部注册花粉数超过1000万
1月7日前可申请自动获得,1月7日后参与其它相关活动获得。
沙发王勋章
荣耀6plus夜景福州鼓岭上的风景海边的景色优雅生活带上荣耀6pIus看城市亲自下厨
花粉达人秀
花粉客户端
Make it Possible
Make your device special
华为云服务
Huawei cloud services
音乐播放器
huawei music
没有最新动态
关注花粉俱乐部
联系我们:
|关注花粉俱乐部:
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利Android自定义视频录制与播放 不错的文章,来不及
转自/android-custom-video-recorder-play.htmlAndroid系统提供了调用系统录像的功能,我们也可以通过指定一些参
Android系统提供了调用系统录像的功能,我们也可以通过指定一些参数来做一定的刻制化操作,
例如:我们可以指定参数MediaStore.EXTRA_VIDEO_QUALITY设定视频的质量,当前可以的值为0(低质量,176 x 144分辨率),1(高质量,如1080p (1920 x 1080)分辨率),
通过设置参数MediaStore.EXTRA_DURATION_LIMIT限定录制时间,
或者通过设置参数MediaStore.EXTRA_SIZE_LIMIT限定录制视频大小。实现代码如下:
Intent intent =new
Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,2);
// CamcorderProfile.get(0,CamcorderProfile.QUALITY_LOW);
//intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 5);
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT,VIDEO_MAX_SIZE);
startActivityForResult(intent, TAKE_VIDEO);
然而我们发现通过这种方式录制视频,不仅无法进行深度的刻制化,例如不能录制自定义的视频分辨率(320×240),也不能通过参数去设定白平衡,录像模式,自动对焦,开启闪光灯等等。
而且我们测试发现,就连传入的参数MediaStore.EXTRA_DURATION_LIMIT,MediaStore.EXTRA_SIZE_LIMIT也不是所有机型都能接收,也就是说,即使你限制了只录制5秒钟的视频,但超过时间视频仍然可以录制,
或者说你限制了只录制2M的视频,但当视频超过规定大小后,视频仍然在录制,直至用户停止或撑爆整个存储空间,
基于以上的事实,为了对录制视频深度的刻制化,解决手机平台间导致的差异,以下是我们本章的主题,自定义视频录制,以及解决视频花屏,视频倒转的问题。
在开始录制之前需要进行预览,视频的录制是通过SurfaceView来进行界面的渲染,要想使用SurfaceView,我们首先要获取到SurfaceHolder,在SurfaceView所在的窗口可见的时候,Surface将会被创建,
你可以通过以下代码获取SurfaceHolder的创建和销毁:
&&&&&SurfaceHolder holder = mSurfaceview.getHolder();
holder.addCallback(videoRecorderSurfaceCallBck);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
SurfaceHolder.Callback videoRecorderSurfaceCallBck=newSurfaceHolder.Callback() {
&&&&@Override
&&&&publicvoid
surfaceDestroyed(SurfaceHolder holder) {
&&&&&&&&// TODO Auto-generated method stub
&&&&&&&&Log.d(TAG,&surfaceDestroyed 将mVideoRecoderSurfaceHolder置空&);
&&&&&&&&mVideoRecoderSurfaceHolder =
&&&&@Override
&&&&publicvoid
surfaceCreated(SurfaceHolder holder) {
&&&&&&&&// TODO Auto-generated method stub
&&&&@Override
&&&&publicvoid
surfaceChanged(SurfaceHolder holder,int
format, int
&&&&&&&&&&&&intheight) {
&&&&&&&&// TODO Auto-generated method stub
&&&&&&&&Log.v(TAG,&surfaceChanged width: &+width+&
, height: &+height);
&&&&&&&&if(holder.getSurface() ==
&&&&&&&&&&&&Log.d(TAG,&holder.getSurface() == null&);
&&&&&&&&&&&&
&&&&&&&&Log.d(TAG,&surfaceChanged 重新给mVideoRecoderSurfaceHolder赋值&);
&&&&&&&&mVideoRecoderSurfaceHolder =
&&&&&&&&if(!playFlag){
&&&&&&&&&&&&if(mPausing) {
&&&&&&&&&&&&&&&&// We're pausing, the screen is off and we already stopped
&&&&&&&&&&&&&&&&// video recording. We don't want to start the camera again
&&&&&&&&&&&&&&&&// in this case in order to conserve power.
&&&&&&&&&&&&&&&&// The fact that surfaceChanged is called _after_ an onPause appears
&&&&&&&&&&&&&&&&// to be legitimate since in that case the lockscreen always returns
&&&&&&&&&&&&&&&&// to portrait orientation possibly triggering the notification.
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}
&&&&&&&&&&&&// The mCameraDevice will be null if it is fail to connect to the
&&&&&&&&&&&&// camera hardware. In this case we will show a dialog and then
&&&&&&&&&&&&// finish the activity, so it's OK to ignore it.
&&&&&&&&&&&&if(camera ==
&&&&&&&&&&&&// Set preview display if the surface is being created. Preview was
&&&&&&&&&&&&// already started.
&&&&&&&&&&&&if(holder.isCreating()) {
&&&&&&&&&&&&&&&&setPreviewDisplay(holder);
&&&&&&&&&&&&}else
&&&&&&&&&&&&&&&&stopVideoRecording();
&&&&&&&&&&&&&&&&restartPreview();
&&&&&&&&&&&&}
&&&&&&&&}else{
&&&&&&&&&&&&playForPlayUsefulness();
在获取到SurfaceHolder之后,可以设定预览显示的SurfaceHolder:
&&&&&&&privatevoid
setPreviewDisplay(SurfaceHolder holder) {
&&&&&&&camera.setPreviewDisplay(holder);
(Throwable ex) {
&&&&&&&closeCamera();
&&&&&&&thrownew
RuntimeException(&setPreviewDisplay failed&, ex);
(责任编辑:赵红霞)
------分隔线----------------------------
使用设计模式来提高程序库的重复利用性是大型程序项目开发必...
存储过程如同一门程序设计语言,同样包含了数据类型、流程控...
CSDN2013博客之星出现了不少问题,发表下我的几点拙见。...
在游戏中,我们经常需要分享到社交网络的功能。分享时,我们...
下文是我翻译于App Widgets的文章,如果有不当之处请大家之处a...
URLtry {OutputStream os =url = new URL(uri);HttpURLConnection conn = (...

我要回帖

更多关于 android camera 对焦 的文章

 

随机推荐