【问题标题】:Android Camera - Preview zooms in when recording videoAndroid相机 - 录制视频时预览放大
【发布时间】:2017-01-10 19:38:49
【问题描述】:

我一直在尝试解决这个问题,但由于某种原因,当我开始用相机录制视频时,预览会放大。我有一些示例中的以下代码:

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    Camera.Parameters myParameters = mCamera.getParameters();
    List<Camera.Size> sizes = myParameters.getSupportedPreviewSizes();
    Camera.Size myBestSize = getBestPreviewSize(sizes, width, height);

    if (myBestSize != null) {
        myParameters.setPreviewSize(myBestSize.width, myBestSize.height);
        myParameters.setVideoStabilization(false);
        mCamera.setParameters(myParameters);
        mCamera.startPreview();
        mCamera.unlock();
    }
}

private Camera.Size getBestPreviewSize(List<Camera.Size> sizes, int width, int height) {
    final double ASPECT_TOLERANCE = 0.05;
    double targetRatio = (double) width / height;

    if (sizes == null) return null;

    Camera.Size optimalSize = null;

    double minDiff = Double.MAX_VALUE;

    int targetHeight = height;

    // Find size
    for (Camera.Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
        for (Camera.Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}

但录制视频时预览仍会放大。我尝试将预览大小手动设置为 1280x720,但是,它不适用于我测试的所有设备,有些设备显示黑色 SurfaceView。

录制视频时有什么方法可以防止预览放大吗? StackOverflow 上的解决方案似乎都不起作用。

编辑:我尝试使用自己的 onMesaure 方法创建自定义 SurfaceView,但现在启动 MediaRecorder 时出现 -19 错误。 (忽略赏金中的-16)

【问题讨论】:

  • 您是否尝试过查看surfaceChanged 被调用了多少次?这可能与您在每次表面变化时都会调用的回调方法中不断调用 getBestPreviewSize 的事实有关。所以您会陷入导致缩放效果的循环中。以onMeasure 之类的方法调用getBestPreviewSize 似乎更聪明,这实际上决定了视图的大小
  • 那么,您是否建议我使用自己的onMeasure 方法创建一个扩展SurfaceView 的自定义视图?也许我可以试一试。
  • 是的,这似乎更有意义。您应该始终检查这确实是问题所在,添加 Log.i 以查看为 myBestSize.widthmyBestSize.height 设置的值
  • 我试过这个,但现在我的 MediaRecorder 在我尝试启动它时会抛出 -19 错误。

标签: android video android-camera surfaceview video-recording


【解决方案1】:

我对您所说的变焦类型感到困惑,可能是软件变焦,也可能是自动对焦,所以我会提出不同的潜在提示,最终解决方案:

  1. 实现mCamera.setZoomChangeListener,例如:

    mCamera.setZoomChangeListener(new Camera.OnZoomChangeListener() {
        @Override public void onZoomChange(int i, boolean b, Camera camera) {
            Log.e("StackOverflow","Zoom just changed !");
            // Inspect things from here
        }
    });
    
  2. 禁用平滑缩放:

    mCamera.stopSmoothZoom(); // My device doesn't support it, but maybe your device does
    
  3. 检查你所有的Camera.Parameters:

    Log.e("StackOverflow", "All Camera parameters :");
    for(String s : mCamera.getParameters().flatten().split(";"))
        Log.e("StackOverflow", s + "\n");
    
  4. 然后切换任何可能与缩放相关的内容,例如:

    Camera.Parameters parameters = mCamera.getParameters();
    parameters.setZoom(100); // My device support some values in the range 100 | 400
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
    parameters.setVideoStabilization(false);
    
    // Don't forget to add the new parameters to the camera :
    mCamera.setParameters(parameters);
    

问候

【讨论】:

    【解决方案2】:

    你可能有setVideoStabilization(true)。在高分辨率例如4K,如果启用此功能,它将创建此跳转缩放。

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多