startPreview 功能很慢,有啥解决方法吗?

Posted

技术标签:

【中文标题】startPreview 功能很慢,有啥解决方法吗?【英文标题】:The startPreview function is slow, Any work around?startPreview 功能很慢,有什么解决方法吗? 【发布时间】:2011-11-13 14:47:09 【问题描述】:

问题:

我正在 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());
        
    

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(我4天前开始使用android编程)

问候...

【问题讨论】:

通过处理 onPreviewFrame 使用了另一种方式,我没有通过相机捕获我确实在某些操作(按钮单击)时获得了预览帧 【参考方案1】:

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

看看这是否有影响。

【讨论】:

以上是关于startPreview 功能很慢,有啥解决方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

[image]30 unity导出WEBGL在浏览器打开很慢,有啥办法可以解决一下这个问题吗

ubuntu 开机输入用户名后 进入桌面变得很慢是怎么回事 有啥解决办法吗

我用treeview实现的树形菜单,但是数据量很多,加载很慢,各位有啥优化的方法吗?

为啥页面加载总是很慢?有啥办法可以解决?

我家是163拨号上网,网速很慢我下载东西的时候要很长的时间,请问有啥方法可以让他速度快点?

获取过去消息的功能停止工作。有啥办法解决吗?