Android-камера - просмотр изображений при записи видео

Я пытался понять это на некоторое время, но по какой-то причине, когда я начинаю записывать видео с камерой, предварительный просмотр приближается. У меня есть следующий код из некоторых примеров:

@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 не работает.

EDIT: Я попытался создать пользовательский SurfaceView со своим собственным методом onMesaure, но теперь я получаю ошибку -19, когда я запускаю свой MediaRecorder. (не обращайте внимания на -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
        }
    });
    
  • Отключите плавное масштабирование:

    mCamera.stopSmoothZoom(); // My device doesn't support it, but maybe your device does
    
  • Осмотрите все свои Camera.Parameters:

    Log.e("StackOverflow", "All Camera parameters :");
    for(String s : mCamera.getParameters().flatten().split(";"))
        Log.e("StackOverflow", 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, если вы включите это, это создаст это масштабирование перехода.