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

问题描述:

我录像,一旦做记录,我传递给另一个活动预览video.I想要的视频拍摄是完全适合手机屏幕如何设置MediaRecorder的视频大小以完美填充设备屏幕的宽度和高度?在<code>SurfaceView</code>使用<code>MediaRecorder</code>

我试图设置视频大小时,准备记录:

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

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

我还设置在surfaceCreated()相机参数,以及:

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

虽然我设置视频的大小和摄像头的参数,但视频拍摄还没有那样大的使用像素XL模拟器设备screen.I,宽度适合屏幕,但身高只有一半屏幕。

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

这是我的方法与屏幕,以适应视频:

当相机的初始化参数做到这一点代码:

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

我希望这个coul能帮助你。

+0

它是宽度和高度我自己陈述它?screenwidth和screenHeight是由displayMetric? – ken

+0

这个方法'getPreferredPreviewSizeForVideo();'如何定义?你能说出来吗?谢谢 – ken

+0

getPreferredPreviewSizeForVideo是Camera.Parameters中定义的一种方法。 是屏幕宽度和屏幕高度是由displayMetric 拍摄的,宽度和高度对应于上面提到的preferredSize.width和preferredSize.height。 –

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

这是不可能的。

首先,不要求设备的相机支持与屏幕物理分辨率相同的分辨率。其次,您的用户界面可能无法占用整个屏幕(例如,存在于*形式的多窗口设备中的浮动窗口中)。

+0

我的意思是在SurfaceView中捕获一个具有相同高度和宽度的视频,并在SurfaceView中进行预览。在SurfaceView中,视频显示的宽度和高度与SurfaceView完全相同。顺便说一下我的SurfaceView是match_parent ..有可能做到这一点? – ken

+0

@ CommonsWare。嗨,你能帮我解答我的问题吗? https://*.com/q/46790086/4813855非常感谢 –

+0

@ken:“我的意思是在SurfaceView中预览同样高度和宽度的视频” - 这是不可能的。一个'SurfaceView'可以有任何分辨率;您的相机无法支持任意分辨率。 – CommonsWare