2

내 응용 프로그램 용 비디오 레코더 기능을 만들고 있습니다.탭 (Nexus 7)의 비디오 녹화가 실패합니다.

private boolean prepareCameraRecorder() { 
    // BEGIN_INCLUDE (configure_preview) 
    int numCameras = Camera.getNumberOfCameras(); 
    int camId = 0; 

    if (numCameras == 1) { 
     PackageManager pm = getPackageManager(); 

     boolean frontCam = pm 
       .hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT); 
     boolean rearCam = pm 
       .hasSystemFeature(PackageManager.FEATURE_CAMERA); 

     if (frontCam) { 
      camera = CameraHelper.getDefaultFrontFacingCameraInstance(); 
      camId = Camera.CameraInfo.CAMERA_FACING_BACK; 
     } else if (rearCam) { 
      camera = CameraHelper.getDefaultBackFacingCameraInstance(); 
      camId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
     } 

    } else if (numCameras == 2) { 
     if (CAMERA_TYPE == CAMERA_FRONT) { 
      Utils.getInstance().printDebug("displaying front camera "); 
      camera = CameraHelper.getDefaultFrontFacingCameraInstance(); 
      camId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
     } else if (CAMERA_TYPE == CAMERA_BACK) { 
      Utils.getInstance().printDebug("displaying back camera "); 
      camera = CameraHelper.getDefaultBackFacingCameraInstance(); 
      camId = Camera.CameraInfo.CAMERA_FACING_BACK; 
     } 
    } 

    // We need to make sure that our preview and recording video size are 
    // supported by the 
    // camera. Query camera to find all the sizes and choose the optimal 
    // size given the 
    // dimensions of our preview surface. 
    parameters = camera.getParameters(); 
    List<Camera.Size> mSupportedPreviewSizes = parameters 
      .getSupportedPreviewSizes(); 
    Camera.Size optimalSize = CameraHelper.getOptimalPreviewSize(
      mSupportedPreviewSizes, cameraView.getWidth(), 
      cameraView.getHeight()); 

    // Use the same size for recording profile. 

    // Check profile in tab: 

    int profile = -1; 

    // set camera profile 
    if (CamcorderProfile.hasProfile(camId, CamcorderProfile.QUALITY_HIGH)) { 
     profile = CamcorderProfile.QUALITY_HIGH; 
    } else if (CamcorderProfile.hasProfile(camId, 
      CamcorderProfile.QUALITY_480P)) { 
     profile = CamcorderProfile.QUALITY_480P; 
    } else if (CamcorderProfile.hasProfile(camId, 
      CamcorderProfile.QUALITY_720P)) { 
     profile = CamcorderProfile.QUALITY_720P; 
    } else if (CamcorderProfile.hasProfile(camId, 
      CamcorderProfile.QUALITY_1080P)) { 
     profile = CamcorderProfile.QUALITY_1080P; 
    } else if (CamcorderProfile.hasProfile(camId, 
      CamcorderProfile.QUALITY_CIF)) { 
     profile = CamcorderProfile.QUALITY_CIF; 
    } else if (CamcorderProfile.hasProfile(camId, 
      CamcorderProfile.QUALITY_LOW)) { 
     profile = CamcorderProfile.QUALITY_LOW; 
    } else if (CamcorderProfile.hasProfile(camId, 
      CamcorderProfile.QUALITY_QCIF)) { 
     profile = CamcorderProfile.QUALITY_QCIF; 
    } else if (CamcorderProfile.hasProfile(camId, 
      CamcorderProfile.QUALITY_QVGA)) { 
     profile = CamcorderProfile.QUALITY_QVGA; 
    } 
    // 

    CamcorderProfile camProfile = null; 
    camProfile = CamcorderProfile.get(camId, profile); 

    if (profile != -1) { 
     Utils.getInstance().printDebug("profile: " + profile); 
     camProfile.videoFrameWidth = optimalSize.width; 
     camProfile.videoFrameHeight = optimalSize.height; 

     parameters.setPreviewSize(optimalSize.width, optimalSize.height); 
     camera.setParameters(parameters); 
     parameters = camera.getParameters(); 
    } 
    // else { 
    // parameters.setPreviewSize(100, 100); 
    // camera.setParameters(parameters); 
    // } 
    try { 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
    } catch (Exception e) { 
     // ignore: tried to stop a non-existent preview 
    } 

    // set preview size and make any resize, rotate or 
    // reformatting changes here 

    // start preview with new settings 
    try { 
     camera.setPreviewDisplay(holder); 
     camera.startPreview(); 
     camera.setDisplayOrientation(90); 
    } catch (Exception e) { 
     Utils.getInstance().printDebug(
       "Error starting camera preview: " + e.getMessage()); 
    } 
    // BEGIN_INCLUDE (configure_media_recorder) 
    mediaRecorder = new MediaRecorder(); 
    mediaRecorder.reset(); 

    // Step 1: Unlock and set camera to MediaRecorder 
    camera.unlock(); 
    mediaRecorder.setCamera(camera); 

    // Step 2: Set sources 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) 
    if (profile != -1) { 
     mediaRecorder.setProfile(camProfile); 
    } 

    try { 

     // Step 4: Set output file 
     selFilePath = CameraHelper.getOutputMediaFile(
       CameraHelper.MEDIA_TYPE_VIDEO).toString(); 
     mediaRecorder.setOutputFile(selFilePath); 
     Utils.getInstance().printDebug("selFilePath: " + selFilePath); 

     // Step 5: Prepare configured MediaRecorder 
     // if (profile == -1) { 
     // mediaRecorder.setVideoFrameRate(30); 
     // } 

     mediaRecorder.setOrientationHint(90); 
     //mediaRecorder.setVideoSize(optimalSize.width, optimalSize.height); 
     //mediaRecorder.setVideoFrameRate(10); 

     // mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     // mediaRecorder.setAudioEncodingBitRate(192000); 
     // mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
     // mediaRecorder.setVideoEncodingBitRate(12000000); 
     // mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 

     mediaRecorder.prepare(); 
    } catch (IllegalStateException e) { 
     Log.d(TAG, 
       "IllegalStateException preparing MediaRecorder: " 
         + e.getMessage()); 
     e.printStackTrace(); 
     releaseMediaRecorder(); 
     return false; 
    } catch (Exception e) { 
     Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage()); 
     releaseMediaRecorder(); 
     return false; 
    } 
    return true; 
} 
private void startVideo(){ 
mediaRecorder.start() 
} 

내가 전화 (모바일 기기)에서 실행하고 있지만 넥서스 7 (태블릿의) 주에 실패 할 경우 잘 작동이 코드 : 넥서스 나는 카메라와 미디어 레코더 API를 준비하기위한 다음 코드를 사용했다 7에는 사용할 수있는 전면 카메라 만 있습니다.

이 오류이며 로그가 발생했습니다

01-18 19 : 31 : 30.597 : E/MediaRecorder (25847) : 시작 실패 : -19

01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : 치명적인 예외 : 주
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : 프로세스 : com.appsplanet.beasting366, PID : 25847
01-18 19:31 : 31.647 : E/AndroidRuntime (25847) : java.lang.RuntimeException : 시작하지 못했습니다.
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : android.media.MediaRecorder.start (기본 메소드)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : at com .appsplanet.beasting366.ActivityVideoRecord.startVideoRecord (ActivityVideoRecord.java:633)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : com.appsplanet.beasting366.ActivityVideoRecord.access $ 6 (ActivityVideoRecord.java:620))
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : com.appsplanet.beasting366.ActivityVideoRecord $ 2.onClick (ActivityVideoRecord.java:581)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : android.view.View.performClick (View.java:4438)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : android.view.View $ PerformClick.run (View.java:18422)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : android.os.Handler.handleCallback (Handler.java:733)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : android.os.Handler.dispatchMessage (Handler.java:95)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : android.os.Looper.loop (Looper.java:136)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : android.app.ActivityThread.main ActivityThread.java:5017)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : java.lang.reflect.Method.invokeNative (기본 메소드)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : a (java.lang.reflect.Method.invoke (Method.java:515)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:779)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:595)
01-18 19 : 31 : 31.647 : E/AndroidRuntime (25847) : at dalvik.system.NativeStart.main (기본 메소드)

누구든지이 문제를 해결할 수 있습니까?

감사 Ishan의 자이나교

+0

충돌 전에 로그를 게시 할 수 있습니까? 'ActivityVideoRecord.prepareCameraRecorder()'가 성공적으로 끝났습니까? 노출 된 코드에 'private void startVideo()'가있는 동안 로그에 'ActivityVideoRecord.startVideoRecord()'가 표시되는 이유는 무엇입니까? 'ActivityVideoRecord.java'의 633 행에는 무엇이 있습니까? –

답변

0

당신은 당신이 올바른 상태가 확실합니까?

if (frontCam) { 
    camera = CameraHelper.getDefaultFrontFacingCameraInstance(); 
    camId = Camera.CameraInfo.CAMERA_FACING_BACK; 
} else if (rearCam) { 
    camera = CameraHelper.getDefaultBackFacingCameraInstance(); 
    camId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
} 

기기에 뒤쪽을 사용하는 것보다 앞면 캠 만있는 경우.

+0

예, 사실 카메라를 뒤집을 수있는 기능이 있습니다. 두 대의 카메라가있는 경우. 그리고 단 하나의 카메라 만 있다면이 상태로 가지 않을 것입니다. –

2

안타깝게도 Android Camera API는 이해하기 쉽지 않습니다.

public final static int Camera.CameraInfo.CAMERA_FACING_BACK = 0; 
public final static int Camera.CameraInfo.CAMERA_FACING_FRONT = 1; 

int cameraId 매개 변수를 기대 Camera.open() 등의 방법이있다 : 두 INTconstants이 있습니다.

그러나 위의 상수를 Camera.open() 또는 CamcorderProfile.get()으로 사용하는 것은 실수입니다. cameraIdCamera.getNumberOfCameras()-1까지 그래서, 먼저 카메라 0, 제 1 대 , 제 2 대 이다.에 직면 의 값은 Camera.CameraInfo.CAMERA_FACING_BACK 또는 Camera.CameraInfo.CAMERA_FACING_FRONT이 될 보장

Camera camera = Camera.open(cameraId); 
int facing = camera.getCameraInfo().facing(); 

: 다음과 같이 특정 cameraId와 카메라의 방향를 확인할 수 있습니다.

특히 Nexus 7에는 카메라가 하나뿐이므로 항상 cameraId == 0을 사용합니다.