Android相机 - 录制视频时预览放大

Posted

技术标签:

【中文标题】Android相机 - 录制视频时预览放大【英文标题】:Android Camera - Preview zooms in when recording video 【发布时间】: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。

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

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

【问题讨论】:

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

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

    实现mCamera.setZoomChangeListener,例如:

    mCamera.setZoomChangeListener(new Camera.OnZoomChangeListener() 
        @Override public void onZoomChange(int i, boolean b, Camera camera) 
            Log.e("***","Zoom just changed !");
            // Inspect things from here
        
    );
    

    禁用平滑缩放:

    mCamera.stopSmoothZoom(); // My device doesn't support it, but maybe your device does
    

    检查你所有的Camera.Parameters:

    Log.e("***", "All Camera parameters :");
    for(String s : mCamera.getParameters().flatten().split(";"))
        Log.e("***", s + "\n");
    

    然后切换任何可能与缩放相关的内容,例如:

    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,如果启用此功能,它将创建此跳转缩放。

【讨论】:

以上是关于Android相机 - 录制视频时预览放大的主要内容,如果未能解决你的问题,请参考以下文章

Android - 录制视频时预览调整大小

Android CameraX实现摄像头预览拍照录制视频

Android - 录制视频后停止和重置相机时的致命信号 11

Android 使用CameraX实现预览/拍照/录制视频/图片分析/对焦/缩放/切换摄像头等操作

Android 微信小视频录制功能实现

Android视频录制从不入门到入门系列教程————Camera Parameter