Aym*_*yha 8 camera android android-camera
问题:
我在android上做了一个应用程序,需要在拍摄图像时从相机快速响应,我注意到应用程序的行为缓慢,在测量时间之后我注意到函数startPreview()是问题的原因.
代码预览:
这是代码的必要部分(与问题相关).
PreviewGoogle Class(自定义预览): 在应用程序开始时调用surfaceChanged,我设置了一些相机参数然后调用startPreview
public class PreviewGoogle extends ViewGroup implements SurfaceHolder.Callback {
private final String TAG = "myapp1";
Camera mCamera;
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
try
{
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
parameters.setJpegQuality(100);
parameters.setPictureSize(Globals.CAMERA_WIDTH, Globals.CAMERA_HEIGHT);
requestLayout();
mCamera.setParameters(parameters);
long before = System.currentTimeMillis();
mCamera.startPreview();
long after = System.currentTimeMillis();
Log.d(TAG, "PreviewGoogle, surfaceChanged: startPreview took " + (after - before) + " ms");
}
catch (Exception e) {
Log.d(TAG, "PreviewGoogle, surfaceChanged: " + e.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
PhotoShootActivity类: 在这个类中,我在rawImageCallback上调用了startPreview,因为我在jpegCallback中使用了BitmapFactory(不是必需的)
public class PhotoShootActivity extends Activity
{
private static final String TAG = "myapp1";
PreviewGoogle preview;
// Handles data for raw picture
PictureCallback rawCallback = new PictureCallback()
{
public void onPictureTaken(byte[] data, Camera camera)
{
try
{
long before = System.currentTimeMillis();
preview.getCamera().startPreview();
long after = System.currentTimeMillis();
Log.d(PhotoShootActivity.TAG, "PhotoShootActivity, rawCallback: preview started in " + (after - before) + " ms");
}
catch(Exception e)
{
Log.e(TAG, "PhotoShootActivity, rawCallback: " + e.getMessage());
}
}
};
}
Run Code Online (Sandbox Code Playgroud)
计时器号码是这样的:
09-09 10:58:42.336: DEBUG/myapp1(21958): PhotoShootActivity, onCreate
**09-09 10:58:44.396: DEBUG/myapp1(21958): PreviewGoogle, surfaceChanged: startPreview took 1457 ms**
09-09 10:58:48.438: DEBUG/myapp1(21958): PhotoShootActivity, buttonCapture: Picture taken in 65ms
09-09 10:58:48.496: DEBUG/myapp1(21958): PhotoShootActivity, shutterCallback: Empty
**09-09 10:58:49.790: DEBUG/myapp1(21958): PhotoShootActivity, rawCallback: preview started in 662 ms**
Run Code Online (Sandbox Code Playgroud)
第一个startPreview花了大约1500毫秒,第二个花了662毫秒!
我正在寻找的问题不是一个完整的代码(只是提示我:)),我以为我可能会在预览中遗漏一些东西,我想在这种情况下使用线程,但我不熟悉android -sdk(我4天前开始使用android编程)
问候...
来自安卓文档:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
startPreview()
开始捕获预览帧并将其绘制到屏幕上。直到表面提供setPreviewDisplay(SurfaceHolder) 或时,预览才会真正开始 setPreviewTexture(SurfaceTexture),预览才会真正开始。
如果setPreviewCallback(Camera.PreviewCallback)、setOneShotPreviewCallback(Camera.PreviewCallback)、或 setPreviewCallbackWithBuffer(Camera.PreviewCallback)被调用,onPreviewFrame(byte[], Camera)则当预览数据可用时将被调用。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以在你的评论中你说你决定使用onPreviewFrame(byte[], Camera),正如您在文档中看到的那样,它表示仅在预览数据可用时才调用它,这需要一些时间。尝试通过为相机提供纹理或预览显示来添加第一个选项。
即,在你的surfaceChanged(SurfaceHolder holder, int format, int w, int h)方法中:
mCamera.setPreviewDisplay(holder);
Run Code Online (Sandbox Code Playgroud)
看看这是否有影响。
| 归档时间: |
|
| 查看次数: |
1756 次 |
| 最近记录: |