2016-08-04 56 views
0

當我使用MediaRecorder錄製視頻時,我要設置視頻大小。但Camera getParameters()返回getSupportedVideoSizes爲null,並且getSupportedPreviewSizes很好,它將返回1920x1088,1280x960, 1280x720,960x540,720x540,720x480,640x480,352x288,320x240,176x144。如何,如果我設置MediaRecorder的值視頻大小,綁定SurfaceView的屏幕將凍結幾秒鐘後,當我開始record.So,我該怎麼辦?如何在getSupportedVideoSizes返回null時設置視頻大小

回答

1

我的豆蔻的解決方法是這樣的:

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

其中Util.getOptimalPreviewSize是:

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

與相機的旋轉(不在畫面!!)和圖像的尺寸根據/視頻捕捉它會發現最好的預覽大小的視頻/圖像

0

最後我解決了這個問題,預覽紋理視圖是我的活動的頂部,還有一些其他behi ND。我在java代碼中設置了textureview的寬度和高度,但是如果我用dp將它設置爲XML,那麼一切正常,那麼預覽紋理視圖(寬度和高度)與記錄視頻(寬度和高度)之間的關係如何,