gpt4 book ai didi

android - startPreview 功能很慢,有解决办法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:52 27 4
gpt4 key购买 nike

问题:

我在 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编程)

问候...

最佳答案

来自安卓文档:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开始预览()

开始捕获预览帧并将其绘制到屏幕上。在使用 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);

看看这是否有所作为。

关于android - startPreview 功能很慢,有解决办法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7359063/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com