surfaceView和Camera配合进行摄像头的预览

首先是Camera类,在5.0上已经被废弃,不推荐使用但还是支持的。最新的是Camera2类,我还没有研究,据说用法完全不一样,反正也是一个坑跳入另外一个坑。

上面是简介和需要的权限,记得加上权限。

步骤在下面图里:

说了大体的流程去使用这个类,三个标important的条目,按照步骤走就好。需要注意的就是第5条,Pass a fully initialized SurfaceHolder,需要一个已经完全初始化完毕的surface,也就是你需要等surface初始化完毕之后才能调用setPreviewDisplay(SurfaceHolder)
所以最好把openCamera的工作放到surfaceHolder的回调里面去:like here:

@Override
public void surfaceCreated(SurfaceHolder holder) {

System.out.println("surfaceCreated");
camera = Camera.open();
}

然后我们要做的是对Camera进行configure

private void initCamera() {

parameters = camera.getParameters();
parameters.setFlashMode("off"); // 无闪光灯
parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
parameters.setPreviewFormat(ImageFormat.YV12);
parameters.setPictureSize(camWidth, camHeight);
parameters.setPreviewSize(camWidth, camHeight);
//这两个属性 如果这两个属性设置的和真实手机的不一样时,就会报错
camera.setParameters(parameters);
// 横竖屏镜头自动调整
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
parameters.set("orientation", "portrait"); //
parameters.set("rotation", 90); // 镜头角度转90度(默认摄像头是横拍)
camera.setDisplayOrientation(90); // 在2.2以上可以使用
} else// 如果是横屏
{
parameters.set("orientation", "landscape"); //
camera.setDisplayOrientation(0); // 在2.2以上可以使用
}

byte[] buf = new byte[camWidth * camHeight * 3 / 2];
camera.addCallbackBuffer(buf);
camera.setPreviewCallback(this);
}

这些东西我是在surfaceChanged里面调用开启的:

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

System.out.println("surfaceChanged");
initCamera();
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
System.out.println("startPreview");
} catch (IOException e) {
e.printStackTrace();
}
}

上面我们对camera做了初始化并设置了setPreviewCallback,所以我们对图像的处理或者视频的处理就可以在Camera.PreviewCallback它的回调

@Override
public void onPreviewFrame(byte[] data, Camera camera) {

if (data == null) {
return;
}
System.out.println("onPreviewFrame");
int ret = avcCodec.offerEncoder(data, h264);
}

里面做处理,之前设置了camera.setPreviewCallbackWithBuffer();

结果onPreviewFrame只在open的时候调用一次,找了一天的原因。。。。。。。。。。。。才发现是这儿。

先这样,后续做encode再补充。

github resp added.

https://github.com/yocn/CameraPreview

时间: 2024-10-13 06:15:32

surfaceView和Camera配合进行摄像头的预览的相关文章

Android Camera API/Camera2 API 相机预览及滤镜、贴纸等处理

Android Lollipop 增加了Camera2 API,并将原来的Camera API标记为废弃了.相对原来的Camera API来说,Camera2是重新定义的相机 API,也重构了相机 API 的架构.初看之下,可能会感觉Camera2使用起来比Camera要复杂,然而使用过后,你也许就会喜欢上使用Camera2了.无论是Camera还是Camera2,当相机遇到OpenGL就比较好玩了. 问题及思路 Camera的预览比较常见的是使用SurfaceHolder来预览,Camera2

Camera前后摄像头同时预览

闲来无事写的,简单的Demo,不足之处请见谅. PS:有的手机不支持同时打开前后摄像头. 添加权限: <uses-permission android:name="android.permission.INTERNET" /><uses-feature android:name="android.hardware.camera" /><uses-permission android:name="android.permissi

Android 实例讲解自定义Camera拍照和预览以及前后置摄像头切换

上一篇博文讲解了怎么去调用本地图片和调用系统拍照图片(http://blog.csdn.net/a123demi/article/details/40003695)的功能. 而本博文将通过实例实现自定义Camera的功效.具体功能如下: 1.实现自定义Camera拍照: 2.实现前后置摄像头的切换: 3.实现Camera拍照后图片缩小显示以及正常预览: 4.实现Camera拍照后图片保存: 在具体实现代码之前,我们先来了解一下Android api对实现自定义Camera的介绍. 根据api的介

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Android UI2013-05-23 15:04 1600人阅读 评论(1) 收藏 举报 目录(?)[+] http://blog.csdn.net/yanzi1225627/article/details/8580034 最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在

Android自定义照相机 预览拍照 切换前后置摄像头

Android提供了Camera来控制拍照,步骤如下:(1)调用Camera的open()方法打开相机.(2)调用Camera的getParameters()获取拍照参数,该方法返回一个Cmera.Parameters对象.(3)调用Camera.Parameters对象对照相的参数进行设置.(4)调用Camera的setParameters(),并将Camera.Parameters对象作为参数传入,这样就可以对拍照进行参数控制,Android2.3.3以后不用设置.(5)调用Camerade

SurfaceView调用camera进行显示与拍照

1.首先继承SurfaceView并实现SurfaceHolder.Callback接口 使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface-表面,这个概念在 图形编程中常常被提到.基本上我们可以把它当作显存的一个映射,写入到Surface 的内容 可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束.所以Callback 中的surfaceCreated 和surfa

玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo

GLSurfaceView是OpenGL中的一个类,也是能够预览Camera的,并且在预览Camera上有其独到之处. 独到之处在哪?当使用Surfaceview无能为力.痛不欲生时就仅仅有使用GLSurfaceView了.它能够真正做到让Camera的数据和显示分离,所以搞明确了这个,像Camera仅仅开预览不显示这都是小菜,妥妥的. Android4.0的自带Camera源代码是用SurfaceView预览的.但到了4.2就换成了GLSurfaceView来预览. 现在到了4.4又用了自家的

【转】玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo

http://blog.csdn.net/yanzi1225627/article/details/33339965 GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而且在预览Camera上有其独到之处.独到之处在哪?当使用Surfaceview无能为力.痛不欲生时就只有使用GLSurfaceView了,它能够真正做到让Camera的数据和显示分离,所以搞明白了这个,像Camera只开预览不显示这都是小菜,妥妥的.Android4.0的自带Camera源码是用Su

WebRTC中Android Demo中的摄像头从采集到预览流程

APPRTC-Demo调用流程 1.CallActivity#onCreate 执行startCall开始连接或创建房间 2.WebSocketClient#connectToRoom 请求一次服务器 3.回调到CallActivity#onConnectToRoom 开始创建对等连接,同时将视频采集对象,本地和远程的VideoSink,相关参数传入 localProxyVideoSink代理本地视频渲染器 remoteSinks是代理远程视频的渲染器,这里是一个集合 videoCapture是