启动预览功能很慢,有什么解决方法吗?

8

问题:

我正在制作一款需要从相机快速响应的Android应用程序,但是我注意到应用程序表现缓慢。经过测量时间,我发现函数startPreview()是问题的根源。

代码预览:

这是与问题相关的代码必要部分。

PreviewGoogle类(自定义预览): 在应用程序启动时调用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());
        }
    }
}

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());
            }
        }
    };
}

计时器的数字应该是这样的:
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**

第一次startPreview花费了约1500毫秒,而第二次只花费了662毫秒!!!

解决方案:

我正在寻找的问题不是完整的代码(只是给我提示:)),我认为在预览中可能会漏掉某些内容,考虑在这种情况下使用线程,但我还不熟悉Android SDK(我开始学习Android编程才4天)。

顺祝安康...


通过处理onPreviewFrame的另一种方式,我没有使用相机进行捕获,而是在某些操作(按钮点击)上获取预览帧。 - Ayman Kouzayha
1个回答

0

来自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);

看看那是否有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接