【问题标题】:setPreviewFpsRange not working despite values being within getPreviewFpsRange's range尽管值在 getPreviewFpsRange 的范围内,但 setPreviewFpsRange 不起作用
【发布时间】:2013-04-21 05:33:57
【问题描述】:

这个简单的代码:

Camera.Parameters params = currentCamera.getParameters();
params.setPreviewFpsRange( 10000, 15000 );
currentCamera.setParameters( params );

在我的 Nexus 4(或我的摩托罗拉 Atrix)上不起作用,尽管允许的值在 5000 到 120000 的允许范围内。

当我尝试分别使用不同于 5000 和 120000 的任何最小值或最大值时,我得到:

setPreviewFpsRange(const android::QCameraParameters&): error: FPS range 
value not supported

这很愚蠢。此外,我在旧的 Motorola Atrix 上尝试了此代码(显示有效的 fps 范围在 10000 到 30000 之间),但它也不起作用。有什么可以做的吗?

通过对该主题的搜索,我发现 a) 任何地方都没有关于该主题的材料,并且 b) 某些平台可能根本不支持此功能。有点奇怪,谷歌目前的旗舰手机 Nexus 4 不支持它……

【问题讨论】:

    标签: android android-camera frame-rate nexus-4


    【解决方案1】:

    啊啊!因此,作为我寻找答案的一部分,我用我的应用检查了我的 Nexus 10 的操作。事实证明,getSupportedFpsRange 函数返回的值是表示可以输入到 setPreviewFpsRange 中的精确副本的范围,并且不支持任何其他副本(据我所知,无论如何。)

    我发现这一点是因为 Nexus 10 从 getSupportedFpsRange 返回了多个副本。我在这里复制了三个设备的 getSupportedFpsRange 返回值。

    支持的范围值示例

    LG Nexus 4:

    preview-fps-range-values=(5000,120000);

    摩托罗拉 Atrix:

    preview-fps-range-values=(10000,30000);

    三星 Nexus 10:

    preview-fps-range-values=(15000,15000),(24000,24000),(25000,25000),(15000,30000),(30000,30000);

    结论

    我们做不到

    params.setPreviewFpsRange( 29000, 29000 );
    

    强制预览为 29fps,除非设备已经特别支持该副本。

    当然,我研究此功能的最初原因是希望在我自己的应用程序中复制 Nexus 4 丝般流畅的相机预览。这似乎最终证明,至少在 Nexus 4 上,setPreviewFpsRange 对此无济于事。

    是时候继续搜索了。 (:

    【讨论】:

    • 索尼 Xperia 在这方面似乎大同小异。
    • 这就是文档所说的,至少现在是这样:最小和最大预览 fps 必须是 getSupportedPreviewFpsRange() 中的元素之一
    • 即使你做了 params.setPreviewFpsRange(15000, 15000);在受支持的“双重”三星上,不能保证您的 fps 为 15000。setPreviewFpsRange 未编程为强制 fps,顺便说一句,这是来自谷歌的荒谬限制
    【解决方案2】:

    我发现如果 getSupportedPreviewFpsRange 列表只有一对受支持的值,例如 (2000, 35000),即 2fp 到 35fps,那么它将接受该范围之间的任何值。

    如果列表包含更多对,那么您需要使用其中之一

    List<int[]> fpsRange = param.getSupportedPreviewFpsRange();
    
    if (fpsRange.size() == 1) {
        //fpsRange.get(0)[0] < CAMERA_PREVIEW_FPS < fpsRange.get(0)[1]
        param.setPreviewFpsRange(CAMERA_PREVIEW_FPS, CAMERA_PREVIEW_FPS);
    } else {
        //pick first from list to limit framerate or last to maximize framerate
        param.setPreviewFpsRange(fpsRange.get(0)[0], fpsRange.get(0)[1]);
    }
    

    【讨论】:

    • 这可能适用于某些设备,但通常并非如此:例如,华硕 Zenpad 10 (ZD300CL) 仅报告单个 fps 范围 (4000 - 50000),但尝试将 fps 范围设置为 ( 30000 - 30000) 导致“设置参数失败”异常。因此,可能最好的方法是尝试强制所需的帧速率,捕获异常,然后应用第一个 fps 范围,
    猜你喜欢
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2020-08-18
    • 2013-12-18
    • 2019-12-19
    • 2022-01-13
    相关资源
    最近更新 更多