2013-11-27 2 views
14

안녕하세요 만드는 중이라서 내가 camera.I는 시도가삼성 기기 안드로이드에 특정 폭과 높이의 비디오를 녹화하는 방법은 무엇입니까?

를 사용하는 경우에도 CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_HIGH)

에 미디어 레코더의 프로파일을 설정할 수 없습니다 삼성 device.I에 문제가 있습니다 기록에 대한 사용자 정의 카메라를 사용하고있는 안드로이드 응용 프로그램

profile = CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_LOW); 
         profile.videoFrameHeight=360; 
         profile.videoFrameWidth=640; 

는 내 응용 프로그램은 PARAM를 사용하여 코드

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

을 설정할 수 있습니다.

게다가 일부 장치는 카메라의 종횡비가 약간 다르므로 잘못된 비율의 사각형을 요청하거나 지원되는 크기와 다른 사각형을 요청하면 일부 장치에서 충돌이 발생합니다.

어떻게해야합니까?

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

이렇게하면 카메라 앱이 카메라가있는 모든 기기에서 작동합니다.

내가 쓴 getOptimalPreviewSize와 UPDATE

, 당신은 그 비율이 원하는에 가까운 크기를 얻고, 어느 것도 충분하지 않는 경우, 당신은 원하는 닫혀 높이 하나를 얻을. 당신이 크기에 더 많은 importante를 제공하려는 경우, 당신은 같은 쉽게 변화, 뭔가를 할 수

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

을 확인하시기 바랍니다 사전에 appreciable.Thanks 될 것입니다 도움의 많은 devices.Any 유형에 일부 장치 만 충돌에 노력하고 있습니다 의 에테르 류 당신은 당신이 원하는 크기를 요구하고 있지만 everycamera 모든 차원 할 수 있기 때문에이 문제가 발생 비디오 미리보기 폭과 높이 ..

 Camera.Parameters param = camera.getParameters(); 

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

완료 있지만 작동하는지 당신의 대답을 나는이 시도하고 알려줍니다 – Nitin