2017-10-20 97 views
1

我錄像,一旦做記錄,我傳遞給另一個活動預覽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

回答

0

這是我的方法與屏幕,以適應視頻:

當相機的初始化參數做到這一點代碼:

 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。 –

0

所以我的問題是,如何捕捉一個視頻,將完全適合每個屏幕的寬度和高度使用MediaRecorder?

這是不可能的。

首先,不要求設備的相機支持與屏幕物理分辨率相同的分辨率。其次,您的用戶界面可能無法佔用整個屏幕(例如,存在於自由形式的多窗口設備中的浮動窗口中)。

+0

我的意思是在SurfaceView中捕獲一個具有相同高度和寬度的視頻,並在SurfaceView中進行預覽。在SurfaceView中,視頻顯示的寬度和高度與SurfaceView完全相同。順便說一下我的SurfaceView是match_parent ..有可能做到這一點? – ken

+0

@ CommonsWare。嗨,你能幫我解答我的問題嗎? https://stackoverflow.com/q/46790086/4813855非常感謝 –

+0

@ken:「我的意思是在SurfaceView中預覽同樣高度和寬度的視頻」 - 這是不可能的。一個'SurfaceView'可以有任何分辨率;您的相機無法支持任意分辨率。 – CommonsWare

相關問題