1

我想知道我能以多快的速度一张一张地拍照而不会从手机里发出惊喜(比如 fx: 'force close;)

你们有人知道那个时间吗?

我知道 500 毫秒是安全时间。当我用 100、200、300 毫秒进行实验时,会出现错误,但谁知道呢,也许我做错了什么。

4

4 回答 4

0

除了软件问题之外,这实际上取决于您实际使用的设备。我会通过自动拍摄一些固定数量的照片(如 1000 张)、定时并从中找到平均时间和标准偏差来在手机上运行测试。在几个设备和模拟器上这样做肯定会让您了解实际需要多长时间。

于 2010-05-26T15:38:19.707 回答
0

摩托罗拉机器人可以拍摄 30fps 的视频,所以如果你需要非常快的图像,也许你可以使用 MediaRecorder

于 2010-05-26T16:50:27.663 回答
0

这绝对取决于您对“拍照”的定义——正如内森所说,在录制视频(基本上是一系列按比例缩小的压缩图片)时,您可以每 30 毫秒“拍照”一次。但是如果将“拍照”定义为将 5MP 的 jpeg 图片复制到 SD 卡,这可能需要更长的时间。

当你说“只做一个循环(拍摄 1000 张照片)”时,你必须明确描述你的意思,尤其是当你抱怨错误时。

假设您扩展了Camera.PictureCallback界面,在您通过图片之前会在幕后进行大量处理(我相信像 jpeg 压缩)。你有没有尝试在你的实现中抛出一个事件onPictureTaken来拍摄另一张照片?这可能是一种安全的方式来做和测试你想要的东西。否则,如果您触发大量“拍照”事件,可能会发生某种堆溢出,我不知道。

编辑:粗略地说,这就是我的意思:

public void onPictureTaken(
        final byte [] data, final android.hardware.Camera camera) {
    saveDataToFile("/DCIM/tempjpeg.jpg", data);
    camera.takePicture(null, null, this);
}

尽快调用 takePicture - 就在回调中!不要未经修改就使用它,因为这将永远循环。我试过这个,它适用于几张照片,然后就是停止响应。如果你在拍完两张照片后停止它,在 Nexus One 上似乎需要不到一秒钟的时间。希望有帮助。

于 2010-05-26T21:58:04.870 回答
0
boolean isTakingPicture = false;


public void onclick2takepic(View view) {
      try {
        if(!isTakingPicture) {
            mCamera.takePicture(null, null, mPicture);
            isTakingPicture = true;
        }else{
            isTakingPicture=false;
        }
    }catch(Exception e){
        Toast.makeText(this,"cannot take picture: "+e.getMessage(),Toast.LENGTH_SHORT).show();
    }
}


    private Camera.PictureCallback mPicture = new Camera.PictureCallback(){
    @Override
public void onPictureTaken(byte[] data, Camera camera){
        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if(pictureFile==null){
            Toast.makeText(getApplicationContext(),"error creating media file, check permissions",Toast.LENGTH_LONG).show();
            return;
        }
        try{
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        }catch(FileNotFoundException e){
            //Toast.makeText(this,"file not found: "+e.getMessage()).show();
        }catch(IOException e){
            //Toast.makeText(getApplicationContext(),"error accessing file: "+e.getMessage()).show();
        }
        //isTakingPicture = false;
        mCamera.startPreview();
        if(isTakingPicture) {
            mCamera.takePicture(null, null, mPicture);
        }
    }
};

在此代码中有一个递归,只要 isTakingPicture=true; 就会重新开始预览并再次拍照;打开和关闭预览非常耗时,所以我的旧手机每秒无法获得超过几张照片。希望能够不通过 takePicture 做到这一点,因为它无法在没有预览的情况下拍摄,但使用 mediaRecorder 但不知道如何

于 2015-09-11T15:30:00.357 回答