博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
surfaceView和Camera配合进行摄像头的预览
阅读量:6708 次
发布时间:2019-06-25

本文共 2225 字,大约阅读时间需要 7 分钟。

首先是Camera类,在5.0上已经被废弃,不推荐使用但还是支持的。最新的是Camera2类,我还没有研究,据说用法完全不一样,反正也是一个坑跳入另外一个坑。
上面是简介和需要的权限,记得加上权限。
步骤在下面图里:
说了大体的流程去使用这个类,三个标important的条目,按照步骤走就好。需要注意的就是第5条,Pass a fully initialized SurfaceHolder,需要一个已经完全初始化完毕的surface,也就是你需要等surface初始化完毕之后才能调用 。
所以最好把openCamera的工作放到surfaceHolder的回调里面去:like here:
@Overridepublic 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里面调用开启的:
@Overridepublic 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它的回调
@Overridepublic 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

转载于:https://www.cnblogs.com/Sharley/p/5595443.html

你可能感兴趣的文章
C/S和B/S软件测试区别
查看>>
比特币矿机开发公司 Butterfly Labs 接受和解
查看>>
GNU C Library 高危漏洞影响大量应用和设备
查看>>
《深入理解Elasticsearch(原书第2版)》一2.4.1 过滤及查询相关性
查看>>
Mozilla 封杀纂改安全设置的流行 Firefox 扩展
查看>>
如果想自己动手写Docker,你可能需要看这本书(文末附录五篇精彩书摘)
查看>>
《Hadoop与大数据挖掘》一2.6.2 Hadoop TF-IDF编程思路
查看>>
《编写高质量代码:改善c程序代码的125个建议》——建议3-3:使用分数来精确表达浮点数...
查看>>
《IP多播网络的设计与部署(第1卷)》——第1章 IP多播介绍
查看>>
《SQL入门经典(第5版)》一一6.5 问与答
查看>>
《Origin 9.0科技绘图与数据分析超级学习手册》一2.4 工具栏
查看>>
《树莓派Python编程入门与实战》——1.5 决定如何购买外设
查看>>
《Android游戏开发详解》——第2章,第2.16节区分类和对象
查看>>
《网页设计心理学》一1.4 大脑中发生了很多我们不了解的事情
查看>>
HTML5中<script>标签中的defer与async属性详解
查看>>
PHP最佳实践(译)
查看>>
在 FreeBSD 10.1中安装 Mate 桌面
查看>>
《JavaScript面向对象精要》——1.6 鉴别引用类型
查看>>
《你不可不知的关系数据库理论》导读
查看>>
《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.6 窗口定义的重复使用...
查看>>