2017-10-20 3 views
1

ich Video aufnehmen MediaRecorder in einem SurfaceView verwenden, sobald die Aufnahme gemacht, ich auf eine andere Tätigkeit übergeben Sie die video.I eine Vorschau anzeigen möchten die Video-Capture ist passen perfekt zu Gerät BildschirmWie wird die Videogröße von MediaRecorder so eingestellt, dass die Breite und Höhe des Gerätebildschirms perfekt ausgefüllt wird?

Ich habe versucht, Videogröße einstellen, wenn der Recorder vorbereiten:

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

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

I gesetzt auch die Kameraparameter in surfaceCreated() sowie:

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

das erledigt Aufnahme passieren ich das Video auf eine andere Aktivität erfasst und in einen Satz VideoView, das VideoView Layout bereits auf MATCH_PARENT für Breite und Höhe bereits festgelegt.

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

Obwohl ich die Videogröße und Kameraparameter eingestellt, aber die Video-Capture noch nicht so groß wie die Geräte screen.I mit Pixel XL Emulator ist die Breite des Bildschirms passen, aber die Höhe ist nur die Hälfte der Bildschirm.

Also meine Frage ist, wie man ein Video, das perfekt auf die Breite und Höhe jedes Bildschirms passt mit MediaRecorder erfassen?

Antwort

0

Dies ist meine Methode Video mit Bildschirm anzupassen:

wenn init params der Kamera tun, um diesen Code:

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

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

und dieses die die adaptPrefferedVideoSize Methode:

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

und Dies ist die Methode 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; 
    } 

Ich hoffe, dass dir das weiterhilft.

+0

ist es Breite und Höhe ich selbst sagen? Und Bildschirmbreite und screenHeight wird von displayMetric genommen? – ken

+0

Diese Methode 'getPreferredPreviewSizeForVideo();' Wie definiert man? Kann man es auch angeben? danke – ken

+0

getPreferredPreviewSizeForVideo ist eine in Camera.Parameters definierte Methode. Yes screenwidth und screenHeight werden von displayMetric übernommen und die Breite und Höhe entsprechen preferredSize.width und preferredSize.height, wie oben erwähnt. –

0

Also meine Frage ist, wie man ein Video, das perfekt auf Breite und Höhe jedes Bildschirms mit MediaRecorder passt, zu erfassen?

Das ist nicht möglich.

Zunächst müssen die Kameras des Geräts keine Auflösung unterstützen, die der physischen Auflösung des Bildschirms entspricht.

Zweitens nimmt Ihre UI möglicherweise nicht den gesamten Bildschirm auf (z. B. existiert sie in einem frei beweglichen Fenster in einem Freiform-Multi-Fenster-Gerät).

+0

Ich meine, ein Video aufnehmen, die gleiche Höhe und Breite mit Vorschau in SurfaceView.Was ich in SurfaceView sehe, ist das Video genau die gleiche Breite und Höhe mit der SurfaceView..Deshalb Meine SurfaceView ist match_parent..ist das möglich? – ken

+0

@ CommonsWare. Hallo kannst du mir für meine Frage helfen? https://Stackoverflow.com/q/46790086/4813855 Vielen Dank –

+0

@ken: "Ich meine die Erfassung eines Videos, das gleiche Höhe und Breite mit Vorschau in SurfaceView" - das ist nicht möglich. Ein 'SurfaceView' kann eine beliebige Auflösung haben; Ihre Kamera kann keine willkürlichen Auflösungen unterstützen. – CommonsWare

Verwandte Themen