Как установить VideoSize, когда getSupportedVideoSizes возвращает ноль

Когда я использую MediaRecorder для записи видео, я хочу установить размер видео. Но камера getParameters() возвращает getSupportedVideoSizes, равный null, и getSupportedPreviewSizes - это нормально, он возвращает 1920x1088,1280x960,1280x720,960x540,720x540,720x480,640x480. 352x288,320x240,176x144. Как бы то ни было, если я установлю значение videoSize MediaRecorder, экран привязанного SurfaceView будет заморожен через несколько секунд, когда я начну запись. Итак, что мне делать?

2 ответа

Мой обходной путь был таким:

    public void setVideoSize(int width, int height) {
    // Just set Preview size...
    Camera.Parameters params = getParameters();
    List<Camera.Size> sizes = params.getSupportedPreviewSizes();
    Camera.Size preferred = params.getPreferredPreviewSizeForVideo();
    if (preferred == null) {
        preferred = sizes.get(0);
    }

    Camera.Size optimalPreview = Util.getOptimalPreviewSize(mContext, sizes,
            width, height);
    setPreviewSize(optimalPreview.width, optimalPreview.height);
}

Где Util.getOptimalPreviewSize был:

/**
     * Returns the optimal preview size for photo shots
     *
     * @param currentActivity
     * @param sizes
     * @param widthImage
     * @param heightImage
     * @return
     */
    public static Size getOptimalPreviewSize(Activity currentActivity,
                                             List<Size> sizes, int widthImage, int heightImage) {
        final double ASPECT_TOLERANCE = 0.05;
        double targetRatio = 0;

        if (sizes == null) return null;

        Camera.Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;

        // Recupero le dimensioni dello schermo per confrontare le dimensioni della
        // preview con quelle dello schermo, in modo tale che a video veda esattamente ciò che poi
        // andrò a fotografare
        int widthScreen = currentActivity.getWindow().getDecorView().getWidth();
        int heightScreen = currentActivity.getWindow().getDecorView().getHeight();

        targetRatio = (double) widthImage / heightImage;

        if (Util.getDisplayRotation(currentActivity) == 0 || Util.getDisplayRotation(currentActivity) == 180) {
            int temp = heightScreen;
            heightScreen = widthScreen;
            widthScreen = temp;
        }

        int targetHeight = heightScreen;

        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) {
                if (size.width <= widthScreen && size.height <= heightScreen) {
                    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;
    }

В зависимости от поворота камеры (НЕ ЭКРАНА!!) и размера изображения / видео для захвата будет найден лучший размер предварительного просмотра видео / изображения.

Наконец я решаю проблему, просмотр текстуры в верхней части моей деятельности, есть и другие. Я устанавливаю ширину и высоту textureview в java-коде, но если я установлю это в XML с помощью dp, все будет в порядке, так что, какова взаимосвязь между предварительным просмотром textureview (ширина и высота) и записанным видео (ширина и высота)?

Другие вопросы по тегам