Why show error IllegalStateException when setting MediaRecorder?

匿名 (未验证) 提交于 2019-12-03 00:56:02

问题:

My code setting MediaRecorder, it show error at row set Quality

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) 

Why show error IllegalStateException when setting MediaRecorder?

回答1:

Actually you do mMediaRecorder.setOutputFormat() twice: One time explicitly and afterwards mMediaRecorder.setProfile() tries to do it again as you can see in your stacktrace.

The Android Media Recorder has a very low robustness for things like that.

So remove the line that says

mMediaRecorder.setOutputFormat(); 

and the error should go away. And btw. remove

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

which is what mMediaRecorder.setProfile() has already done as well.



回答2:

You may need to release the camera object before the MediaRecorder start, with something like:

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

Call the above method before you start your MediaRecorder methods.

IMPORTANT: Also, the methods below MUST be called in this order:

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

The important bits here are that setVideoEncoder and setAudioEncoder are called last.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!