2016-08-04 9 views
0

Wenn ich MediaRecorder zum Aufzeichnen eines Videos verwende, möchte ich die Videogröße einstellen. Aber die Kamera getParameters() liefert die getSupportedVideoSizes ist null und die getSupportedPreviewSizes ist in Ordnung, es gibt 1920x1088,1280x960 zurück. 1280x720,960x540,720x540,720x480,640x480,352x288,320x240,176x144. Wie auch immer, wenn ich den Wert videoSize von MediaRecorder einstelle, wird der Bildschirm der gebundenen SurfaceView nach ein paar Sekunden eingefroren, wenn ich die Aufnahme starte. Also, was soll ich tun?Wie setze ichVideoSize, wenn getSupportedVideoSizes Null zurückgibt

Antwort

1

My leidet Abhilfe war:

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

Wo Util.getOptimalPreviewSize war:

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

mit der Drehung der Kamera Nach (nicht auf dem Bildschirm !!) und die Dimension des Bildes/Video, um es zu erfassen wird die beste Vorschau Größe von Video/Bild gefunden

0

Schließlich löse ich das Problem, die Vorschau texturview ist in der Spitze meiner Tätigkeit, gibt es einige andere behi nd. Ich setze die Breite und Höhe der Texturansicht in Java-Code, aber wenn ich dies im XML-Format mit dp einstelle, ist alles in Ordnung, also wie ist die Beziehung zwischen der Vorschautexturansicht (Breite und Höhe) und den Videoaufnahmen (Breite und Höhe)

Verwandte Themen