如何设置MediaRecorder的视频大小以完美填充设备屏幕的宽度和高度?

时间:2017-10-20 08:55:45

标签: android video mediarecorder android-mediarecorder

我在MediaRecorder中使用SurfaceView录制视频,一旦完成录制,我会转到另一个活动预览视频。我希望视频捕捉完全适合设备屏幕

我在准备录音机时试图设置视频大小:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
height = displayMetrics.heightPixels;
width = displayMetrics.widthPixels;

//# Video settings
mRecorder.setVideoSize(width,height);

我也在surfaceCreated()中设置了camera参数:

mCamera = Camera.open();
Camera.Parameters parameters;
parameters = mCamera.getParameters();
parameters.setPreviewSize(width,height);
mCamera.setParameters(parameters);

完成录制后,我会将捕获的视频传递给其他活动,并设置为VideoViewVideoView布局已经设置为MATCH_PARENT宽度和高度。

videoPreview = (VideoView)findViewById(R.id.videoPreview);
videoPreview.setVideoURI(videoUri);
videoPreview.start();

虽然我设置了视频大小和摄像头参数,但视频拍摄仍然没有设备屏幕那么大。我使用Pixel XL仿真器,宽度适合屏幕,但高度只有屏幕的一半。 / p>

所以我的问题是,如何使用MediaRecorder捕获完全适合每个屏幕宽度和高度的视频?

2 个答案:

答案 0 :(得分:0)

这是我用屏幕调整视频的方法:

当相机的init参数执行此代码时:

     Camera.Parameters params = mCamera.getParameters();
                        preferredSize = params.getPreferredPreviewSizeForVideo();
                        adaptPrefferedVideoSize(params);
                        params.setPreviewSize(preferredSize.width, preferredSize.height);

adjustVideoSurface(screenWidth, screenHeight,preferredSize.width, preferredSize.height, surfaceView);
    //...

这就是adaptPrefferedVideoSize方法:

 public void adaptPrefferedVideoSize(Camera.Parameters params) {

        Camera.Size sizeW640 = params.getPreviewSize();
        Camera.Size sizeW720 = params.getPreviewSize();
        Camera.Size sizeW1280 = params.getPreviewSize();

        sizeW640.width = 640;
        sizeW640.height = 480;

        sizeW720.width = 720;
        sizeW720.height = 480;

        sizeW1280.width = 1280;
        sizeW1280.height = 720;

        preferredSize = sizeW1280;

        /*************************/
        if (params.getSupportedVideoSizes() != null) {
            if (params.getSupportedVideoSizes().contains(sizeW1280)) {
                preferredSize = sizeW1280;
            } else if (params.getSupportedVideoSizes().contains(sizeW720)) {
                preferredSize = sizeW720;
            } else {
                preferredSize = sizeW640;
            }
        } else if (preferredSize != null) {
            if (preferredSize.width > sizeW1280.width) {
                preferredSize = sizeW1280;
            } else if (!preferredSize.equals(sizeW720)) {
                preferredSize = sizeW640;
            }
        } else {
            preferredSize = sizeW640;
        }
    }

这是adjustVideoSurface方法:

public static boolean adjustVideoSurface(int screenWidth,
                                             int screenHeight,
                                             int width,
                                             int height,
                                             SurfaceView surfaceView) {


        int preferredWidth = (width < height) ? width : height;
        int preferredHeight = (width < height) ? height : width;

        float ratioW = (float) screenWidth / preferredWidth;
        float ratioH = (float) screenHeight / preferredHeight;
        RelativeLayout.LayoutParams layoutParams;


        int displayedHeight = (int) (ratioW * preferredHeight);
        int displayedWidth = (int) (ratioH * preferredWidth);

        layoutParams = new RelativeLayout.LayoutParams(screenWidth, displayedHeight);

        if (displayedHeight > screenHeight) {
            layoutParams = new RelativeLayout.LayoutParams(displayedWidth, screenHeight);
        }

        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        surfaceView.setLayoutParams(layoutParams);
        surfaceView.requestLayout();


        return Math.round(ratioH - ratioW) == 0;
    }

我希望这个可以帮到你。

答案 1 :(得分:0)

  

所以我的问题是,如何使用MediaRecorder捕获完全适合每个屏幕宽度和高度的视频?

这是不可能的。

首先,不要求设备的摄像机支持的分辨率等于屏幕的物理分辨率。

其次,您的UI可能无法全屏占用(例如,存在于自由形式多窗口设备的浮动窗口中)。