¿Por qué mostrar el error IllegalStateException al configurar MediaRecorder?

Mi código que configura MediaRecorder, muestra error en el conjunto de filas Calidad

mMediaRecorder = new MediaRecorder(); // Step 1: Unlock and set camera to MediaRecorder mCamera.stopPreview(); mCamera.unlock(); mMediaRecorder.setCamera(mCamera); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setProfile(CamcorderProfile .get(CamcorderProfile.QUALITY_HIGH)); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 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 mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); // Step 6: Prepare configured MediaRecorder try { mMediaRecorder.prepare(); Log.d("DEBUG", "IllegalStateException preparing MediaRecorder: " + e.getMessage()); releaseMediaRecorder(); return false; } catch (IOException e) { Log.d("DEBUG", "IOException preparing MediaRecorder: " + e.getMessage()); releaseMediaRecorder(); return false; } 

Ex:

 java.lang.IllegalStateException 

Stacktrace:

 java.lang.IllegalStateException at android.media.MediaRecorder.setOutputFormat(Native Method) at android.media.MediaRecorder.setProfile(MediaRecorder.java:366) at jp.osaka.E028.prepareVideoRecorder(E028.java:1441) at jp.osaka.E028.access$16(E028.java:1403) at jp.osaka.E028$6.onClick(E028.java:344) at android.view.View.performClick(View.java:3517) at android.view.View$PerformClick.run(View.java:14155) at android.os.Handler.handleCallback(Handler.java:605) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4503) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) at dalvik.system.NativeStart.main(Native Method) 

¿Por qué mostrar el error IllegalStateException al configurar MediaRecorder?

Realmente hace mMediaRecorder.setOutputFormat() dos veces: Una vez explícitamente y después mMediaRecorder.setProfile() intenta hacerlo de nuevo como se puede ver en su stacktrace.

El grabador de medios Android tiene una robustez muy baja para cosas como esa.

Quite la línea que dice

 mMediaRecorder.setOutputFormat(); 

Y el error debe desaparecer. Y por cierto. retirar

 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 

Que es lo que mMediaRecorder.setProfile() ya ha hecho tan bien.

Es posible que tenga que liberar el objeto de la cámara antes de que comience el MediaRecorder, con algo como:

 private void releaseCamera() { if (myCamera != null) { // Release the camera object so other classes can use it. myCamera.release(); myCamera = null; } } 

Llame al método anterior antes de iniciar los métodos de MediaRecorder.

IMPORTANTE : También, los métodos abajo DEBEN llamarse en este orden:

 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoSize(640,480); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 

Los bits importantes aquí son que setVideoEncoder y setAudioEncoder son llamados últimos.

  • Detección de rostros en Android?
  • Google Maps v2 que centra y que da vuelta a la posición de la cámara para caber dos marcadores
  • StartPreview falló pero no todos los dispositivos
  • Android: cómo detectar si la cámara parpadea
  • Uso de SurfaceTexture en combinación con RenderScript
  • Android 2.3.4 se bloquea en Camera.setParameters
  • Rotación de la cámara ortográfica
  • ¿Cómo obtener una resolución completa y datos de imagen sin comprimir con la cámara Android?
  • Android: tomar fotos y guardarlas con un nombre personalizado en un destino personalizado mediante Intent
  • Cómo liberar la cámara después de la actividad termina en Android?
  • Android Camera Intent Geo-Etiquetado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.