为什么默认的安卓相机预览比我的相机预览更流畅?

7

我刚刚设置了一个非常基本的相机预览,显示全屏相机画面。我比较了我的应用和安卓相机的流畅度,发现安卓相机似乎更加流畅。

为什么会这样?有没有特殊的技巧来提高相机预览的性能?


也许你可以将相机的帧率设置得更高。 - Robin Dijkhof
安卓相机应用程序是否可能使用某种异步任务功能?有人尝试过构建使用异步任务的自定义相机应用程序吗? - user2426316
亲爱的上帝,是的。我一直在试图自己解决这个问题。深入研究相机源代码,我没有看到任何显著不同之处,他们也使用了最大可用预览尺寸。我已经尝试过使用回调缓冲区来显示预览,使用TextureView而不是SurfaceView,几乎想到了所有可能的方法,但都没有成功。如果您找到解决方案,我很乐意听取。 - Kevin Coppock
2个回答

7

我曾经也遇到过同样的问题,后来发现问题与相机分辨率有关。很可能你的Camera正在用最大可用分辨率初始化,这可能会导致预览时性能变慢。尝试使用类似以下的方法设置较低的picture size

Camera.Parameters params = camera.getParameters();
params.setPictureSize(1280, 960);
camera.setParameters(params);

请注意,您需要设置可用的图片尺寸。您可以使用以下命令检查可用的尺寸:

camera.getParameters().getSupportedPictureSizes();

希望能对您有所帮助。

编辑

看起来如果使用具有不同宽高比的图片大小,会使性能变慢。这是我选择pictureSize的方法。-

首先,我获取相机默认pictureSize的宽高比。

Camera.Parameters params = camera.getParameters();
defaultCameraRatio = (float) params.getPictureSize().width / (float) params.getPictureSize().height;

然后我获得了一个更小的 pictureSize,它适合相同的比例。

private Size getPreferredPictureSize() {
    Size res = null;
    List<Size> sizes = camera.getParameters().getSupportedPictureSizes();

    for (Size s : sizes) {
        float ratio = (float) s.width / (float) s.height;
        if (ratio == defaultCameraRatio && s.height <= PHOTO_HEIGHT_THRESHOLD) {
            res = s;
    break;
        }
    }
    return res;
}

在这里,PHOTO_HEIGHT_THRESHOLD 是您想要允许的最大高度。


库存相机应用程序使用与取景器匹配的预览大小(即应该是可用的最大预览大小);您可以在com.android.camera.Util#getOptimalPreviewSize()中看到这一点。减小预览大小肯定有助于性能,但库存应用程序能够更流畅地使用全分辨率。 - Kevin Coppock
哦,有趣。你是说缩小图片尺寸而不是预览尺寸可以提高性能吗?即使你没有拍照?我所指的代码肯定只与预览大小有关。 - Kevin Coppock
没错,我尝试了所有的方法,包括更改“previewSize”和使用回调缓冲区。然而,通过“setPictureSize”,我得到了迄今为止最好的结果(至少我找不到与Android相机应用程序的差异)。实际上,我目前根本没有触及“previewSize”。 - ssantos
不幸的是,对我来说似乎没有任何区别。我将图片大小设置为176 x 144,但它看起来一样。 - Kevin Coppock
如果这个能够工作,那一定是API的一个bug。我很快就会试一下。 :) - Kevin Coppock
显示剩余5条评论

2
这个答案有点晚了,但是在遇到同样的问题后,我想分享一下我找到的解决方法。不仅我无法匹配股票相机的“平滑度”,而且我也无法匹配股票相机的测光。我的实时预览比股票相机在低光情况下要暗得多。我的解决方案最终是一个FPS问题,正如Robin在早期评论中提出的那样。Nexus 5上的默认预览FPS为静态15 FPS。股票Android应用程序检测并设置一个使用动态范围的预览FPS(只要该范围包括30fps)。在nexus 5上,该范围为7fps-> 30fps。在低光条件下,相机会降低FPS以保持预览亮度,而在明亮条件下,它会跳到平稳的30 fps。来自股票Android照片应用程序的相关代码:

以下是使用针对Nexus 5的硬编码值(为简单起见)设置FPS的相机API调用。

public void setFps(Camera camera) {
    Camera.Parameters params = camera.getParameters();
    params.setPreviewFpsRange(7000, 30000);
    camera.setParameters(params);
}

通过 Android 照片应用程序中的相关代码,我得到了所需的内容,以获取适当的 FPS 值。然后,我使用这些值而不是硬编码来完成相同的操作。实际上,我正在使用旧版相机而不是 Camera2,并且获取 FPS 的代码运行良好。 - manusobles

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