第一次接触Camera 绘制实时帧,关于onpreviewframe,不回调的问题
2014-09-12 18:10
405 查看
class MyCamera implements PreviewCallback { @SuppressLint("NewApi") @Override public void onPreviewFrame(byte[] data, Camera camera) { Camera.Parameters ps = camera.getParameters(); int[] imgs = new int[ps.getPreviewSize().width * ps.getPreviewSize().height]; try { Log.i("tyty", ps.getPreviewSize().width + "=====" + ps.getPreviewSize().height); //doyouself } catch (Exception e) { Log.i("tyty", "Exception new bmp" + e.toString()); return; } if (bmp != null) { Canvas canvas = surfaceHolder.lockCanvas(); try { if (canvas != null) { Log.i("tyty", "bmp已画图"); canvas.drawBitmap(bmp, 0, 0, null); } } catch (Exception e) { Log.i("tyty", "Exception draw bmp" + e.toString()); } finally { if (canvas != null) { surfaceHolder.unlockCanvasAndPost(canvas); } } } camera.addCallbackBuffer(data); Log.i("tyty", "回调"); } }
第一次写一个关于摄像头的需求,所以大部分都是参照安卓讲义上面写的,要处理实时的帧数,就要一个PreviewCallback的回调。不多说上代码保存笔记。
camera = Camera.open(0); camera.setDisplayOrientation(90); Camera.Parameters parameters = camera.getParameters(); MediaActionSound actionSound = new MediaActionSound(); parameters.setPreviewSize(720, 1280); parameters.setPreviewFpsRange(4, 10); parameters.setPictureFormat(ImageFormat.JPEG); parameters.set("jpeg-quelity", 85); parameters.setPictureSize(720, 1280); if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); } int[] textures = new int[1]; GLES20.glGenTextures(1, textures, 0); surfaceTexture = new SurfaceTexture(textures[0]); try { camera.setPreviewTexture(surfaceTexture); camera.setPreviewCallback(new MyCamera()); camera.startPreview(); } catch (IOException e) { Log.i("tyty", e.toString()); e.printStackTrace(); }
上面的代码片段是初始化摄像头,没有什么好多说的,一般是注意一些属性照写。
class MyCamera implements PreviewCallback { @SuppressLint("NewApi") @Override public void onPreviewFrame(byte[] data, Camera camera) { Camera.Parameters ps = camera.getParameters(); int[] imgs = new int[ps.getPreviewSize().width * ps.getPreviewSize().height]; try { Log.i("tyty", ps.getPreviewSize().width + "=====" + ps.getPreviewSize().height); //doyouself } catch (Exception e) { Log.i("tyty", "Exception new bmp" + e.toString()); return; } camera.addCallbackBuffer(data); Log.i("tyty", "回调"); } }
本以为这样写,就可以了,但是发现onpreviewframe这个方法只会被调用5-8次之间,然后再不会被调用,这就揪心啦,实时帧肯定是要不断更新的,那为什么调用几次之后会被停下来呢?找了很多朋友求解答,可能是我表达的不够准确,也没有把问题给解决了。后面我也去csdn发帖了,非常感谢
birdsaction 版主给我的灵感,之后我去andriod官网去查了一下,对setPreviewCallback的描述是保持preview活跃,onpreviewframe就会一直被callback。
这样想,那只要有方法设置preview活跃就行了?
然后我用setPreviewTexture试了一下,没有想到可以了。虽然找不出官方的解释,也只能对这样做就解决问题进行脑补了。。。。。
在onpreviewframe里面添加setPreviewTexture,把 原来的texture设置进去就ok了。
菜鸟耗时一天才找到问题所在,唉。。。著文留念 顺便下班回家。
相关文章推荐
- 困扰一天啦,求大神不吝指导,Camera的onPreviewFrame中的问题
- 困扰一天啦,求大神不吝指导,Camera的onPreviewFrame中的问题
- Android camera onPreviewFrame 图片旋转问题
- 困扰一天啦,求大神不吝指导,Camera的onPreviewFrame中的问题
- 困扰一天啦,求大神不吝指导,Camera的onPreviewFrame中的问题
- Camera的onPreviewFrame回调方法中图片帧数据data最后显示出现错位拼接的bug
- 新手求教。。有关onPreviewFrame未被调用的问题
- 从public void onPreviewFrame(byte[] data, Camera arg1)拿到Bitmap
- 关于startActivityForResult跳转页面返回时onActivityResult回调无法执行的问题
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- 关于Fragment下面onActivityResult()无回调的问题
- onPreviewFrame报GC问题解决方法
- 我的第一篇博客:关于android的Camera在takePicture()时不回调onPictureTaken()方法
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- [转]Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- 从public void onPreviewFrame(byte[] data, Camera arg1)拿到Bitmap(收集)
- android camera onPreviewFrame后生成角度错误的图像后纠正方法