0

编辑:我发现问题出在 onPreviewFrame 函数中:

@Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        if (frameCount == 0) {
            start = System.currentTimeMillis();
        } else if (frameCount % 100 == 0) {
            Log.e("FPS", 1000 * frameCount
                    / (System.currentTimeMillis() - start) + "");
        }
        frameCount++;
        Bitmap temp = BitmapFactory.decodeByteArray(data, 0, data.length);
        try {
            temp.compress(CompressFormat.JPEG, 90, new FileOutputStream(new File("/sdcard/"+frameCount+".jpg")));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        camera.addCallbackBuffer(data);
    }

如果我删除所有与 Bitmap 相关的代码,那么程序可以拍照而不会出现任何错误。如何保存帧图像和使用 Camera.takePicture 生成的更好图像?我试图在触摸按钮时从相机保存照片并开始另一个活动来编辑照片。

mTakePic.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    mTakePic.setImageDrawable(takePicDown);
                    mCamera.takePicture(new ShutterCallback() {

                        @Override
                        public void onShutter() {
                            // TODO Auto-generated method stub

                        }
                    }, null, new PictureCallback() {


                        @Override
                        public void onPictureTaken(byte[] yuv, Camera camera) {
                            Intent editImage = new Intent(getApplicationContext(), EditActivity.class);

                            if(savePhoto != null) {
                                try {
                                    savePhoto.get();
                                } catch (InterruptedException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (ExecutionException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                            savePhoto = new SavePhotoTask();
                            savePhoto.execute(yuv);

//                          releaseCamera();
                            startActivity(editImage);
                        }
                    });
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mTakePic.setImageDrawable(takePicUp);
                }
                return true;
            }
        });

有时它运行顺利而没有错误,但大多数时候它最终会出错,我必须重新启动手机才能让相机再次工作。我使用 SurfaceView 预览相机帧。

4

1 回答 1

1

编辑:对不起,我弄错了问题,我以为您将您提到的崩溃链接到 SavePhotoTask。以下是保存照片的方法PictureCallback

第一个参数onPictureTaken是包含图像的字节数组。简单地将其写入文件是我发现保存图像的最佳方式。像这样的东西...

FileOutputStream out = new FileOutputStream("path/to/image");
out.write(data, 0, data.length);
out.close();

其中“数据”是 的第一个参数onPictureTaken。同样的技术应该可以保存每一帧,onPreviewFrame但我从未尝试过,所以我不能确定。似乎您有将此操作放在单独的线程上的想法,这非常好,我将继续探索该选项。但是,我会避免使用位图,因为这将花费时间和资源,并且如果您同时转换许多帧并将所有这些位图都保存在内存中,则可能会导致 OOM 错误。


调用 后Camera.open(),您的应用程序将锁定相机并阻止任何其他应用程序(包括您自己的应用程序的后续实例)使用它。当您的应用程序完成时必须拨打电话,Camera.release()否则相机将保持锁定状态,直到您已经注意到,手机重新启动。 相机的开发文档顶部有一个很好的清单,以确保正确使用该类。

我已经成功地调用了Camera.open()inonResume()Camera.release()in onPause()。为了使事情顺利进行并且没有错误,您可能还需要在这些点管理您的开始和停止预览。

于 2013-04-26T17:56:13.867 回答