Android Camera - 录制视频时预览放大

标签 android video android-camera surfaceview video-recording

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

@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)

最佳答案

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

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

问候

关于Android Camera - 录制视频时预览放大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39296612/

相关文章:

android - GLSurfaceView 无法解析为类型

java - 如何在 Android 中使用 SQLite 多表触发带有计数的连接查询?

html - 有没有办法在播放后立即隐藏 HTML5 视频?

python - Tkinter 中的视频输出?

Android Camera OnActivityResult 将照片路径重置为 null

Android SDK Nexus S 原生相机问题

android - Flutter TextField 和 TextFormField 在使用初始值或 Controller 设置初始文本时重复文本

video - html5播放事件与视频标签中的播放事件

android - 相机请求代码在Android中意味着什么

android - 应用 ColorFilter 但在 PNG 文件中保留透明阴影