2013-11-27 22 views
14

你好我正在在我使用自定義的相機記錄camera.I我有三星device.I問題無法媒體記錄的個人資料設置爲CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_HIGH)如何在三星設備android上錄製特定寬度和高度的視頻?

還當嘗試使用

一個Android應用程序
profile = CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_LOW); 
         profile.videoFrameHeight=360; 
         profile.videoFrameWidth=640; 

然後我的應用程序工作的一些設備,但在許多devices.Any類型的幫助下崩潰會appreciable.Thanks事先請檢查代碼

Camera.Parameters param = mCamera.getParameters(); 
      param.set("cam_mode", 1); 
     // Enable video stabilization. Convenience methods not available in API 
      // level <= 14 
      String vstabSupported = param.get("video-stabilization-supported"); 
      if ("true".equals(vstabSupported)) { 
       param.set("video-stabilization", "true"); 
      } 
      List<Size> sizes = mCamera.getParameters() .getSupportedVideoSizes(); 
      mCamera.setParameters(param); 
      mMediaRecorder = new MediaRecorder(); 
      // Step 1: Unlock and set camera to MediaRecorder 
      mCamera.unlock(); 
      mMediaRecorder.setCamera(mCamera); 
      mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 
      // Step 2: Set sources 
      mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
      mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
      String deviceMan = android.os.Build.MANUFACTURER; 
      Toast.makeText(getApplicationContext(), deviceMan, Toast.LENGTH_SHORT).show(); 
      // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) 
      CamcorderProfile profile = CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_LOW); 
//   if(!CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH)){Log.d("", "the camcorder profile instance is null"); 
      int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
      if (currentapiVersion >= android.os.Build.VERSION_CODES.FROYO){ 
       // Do something for froyo and above versions 
       boolean tellbol=CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH); 
       if(deviceMan.equals("samsung")){ 
         profile = CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_LOW); 
         profile.videoFrameHeight=360; 
         profile.videoFrameWidth=640; 
       } 
       else{ 
         profile = CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_HIGH); 
       } 
       mMediaRecorder.setProfile(profile); 
      } else{ 
       // do something for phones running an SDK before froyo 
       mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
       mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
//    mMediaRecorder.setVideoSize(720, 480); 
       mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
      } 

      // Step 4: Set output file 
      mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 
      // Step 5: Set the preview output 
      // Step 6: Prepare configured MediaRecorder 
      try { 
       mMediaRecorder.prepare(); 
      } catch (IllegalStateException e) { 
       Log.d("Video", "IllegalStateException preparing MediaRecorder: " + e.getMessage()); 
       releaseMediaRecorder(); 
       return false; 
      } catch (IOException e) { 
       Log.d("Video", "IOException preparing MediaRecorder: " + e.getMessage()); 
       releaseMediaRecorder(); 
       return false; 
      } 
      return true; 

回答

36

這是因爲你被要求你想要的尺寸,但不everycamera能夠每一個層面的。另外,有些設備的相機縱橫比略有不同,所以如果您要求一個比例錯誤的矩形,或者尺寸與支持的尺寸不同,它會在某些設備中崩潰。

怎麼辦?

第1步:

你必須檢查所支持的大小。你可以這樣做

Camera.Parameters p = myCamera.getParameters(); 
List<Size> previewsizes = p.getSupportedPreviewSizes(); 
List<Size> videosizes = p.getSupportedVideoSizes(); 

然後,你可以選擇一個。如果你想使自動化這一點,你可以走的更遠,並按照

步驟2

編寫一個函數來選擇最適合的尺寸,這將收到支持的尺寸和所需的大小,東西像:

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
     final double ASPECT_TOLERANCE = 0.2; 
     double targetRatio = (double) w/h; 
     if (sizes == null) 
      return null; 

     Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = h; 

     // Try to find an size match aspect ratio and size 
     for (Size size : sizes) { 
      Log.d("Camera", "Checking size " + size.width + "w " + size.height 
        + "h"); 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) 
       continue; 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 

     // Cannot find the one match the aspect ratio, ignore the 
     // requirement 
     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

而最後步驟中,設定的參數

步驟3

private int desiredwidth=640, desiredheight=360; 

Size optimalPreviewSize = getOptimalPreviewSize(previewsizes, desiredwidth, desiredheight);   

Size optimalVideoSize = getOptimalPreviewSize(videosizes, desiredwidth, desiredheight);  

p.setPreviewSize(optimalPreviewSize.width, optimalPreviewSize.height); 

mCamera.unlock(); 
mMediaRecorder = new MediaRecorder(); 
mMediaRecorder.setCamera(mCamera); 

mMediaRecorder.setVideoSize(optimalVideoSize.width, optimalVideoSize.height); 
myCamera.setParameters(p); 

有了這個,你的相機應用程序將在每個設備工作用相機!

UPDATE

隨着我寫的getOptimalPreviewSize,你得到它的比例是接近所需的大小,如果沒有足夠好,你得到它的高度閉合所需的一個。如果你想給更多重要提示的大小,可以使一個簡單的變化,喜歡的東西

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
    final double ASPECT_TOLERANCE = 0.2; 
    double targetRatio = (double) w/h; 
    if (sizes == null) 
     return null; 

    Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 

    int targetHeight = h; 

    if ( you want ratio as closed to what i asked for) 
    { for (Size size : sizes) { 
     Log.d("Camera", "Checking size " + size.width + "w " + size.height 
       + "h"); 
     double ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) 
      continue; 
     if (Math.abs(size.height - targetHeight) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(size.height - targetHeight); 
     } 
    } 
    } 

    if (you want height as closed to what i asked for) { //you can do other for width 
     minDiff = Double.MAX_VALUE; 
     for (Size size : sizes) { 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 

    if (you want the bigest one) { 
     minDiff = 0; 
     for (Size size : sizes) { 
      if ( size.height * size.width > minDiff) { 
       optimalSize = size; 
       minDiff = size.height * size.width ; 
      } 
     } 
    } 
    return optimalSize; 
} 
+0

謝謝您的回答,我會嘗試這一點,讓你知道它是否正在工作或不是 – Nitin

+0

看看更新。你可以使用getSupportedVideoSizes()而不是我之前告訴過你的功能,剩下的就像你想象的那樣... –

+0

我曾用這種方法 – Nitin

0

隨着使用帕拉姆ETERS您可以設置視頻預覽的寬度和高度..

 Camera.Parameters param = camera.getParameters(); 

     param.setPreviewSize("your width" 
       "your height"); 
     camera.setParameters(param); 
+0

做,但不工作的三星大 – Nitin

相關問題