【问题标题】:Why show error IllegalStateException when setting MediaRecorder?为什么在设置 MediaRecorder 时显示错误 IllegalStateException?
【发布时间】:2014-04-05 07:16:23
【问题描述】:

我的代码设置 MediaRecorder,它在行设置质量显示错误

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

例如:

java.lang.IllegalStateException

堆栈跟踪:

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)

为什么设置MediaRecorder时显示错误IllegalStateException?

【问题讨论】:

  • 请发布您的堆栈跟踪。
  • 您需要将e.getMessage() 更改为e.fillInStackTrace()。然后,在此处发布您的堆栈跟踪!
  • 我在下面提供了答案。

标签: android android-camera


【解决方案1】:

实际上你做了两次mMediaRecorder.setOutputFormat():一次明确地,然后mMediaRecorder.setProfile() 尝试再做一次,正如你在堆栈跟踪中看到的那样。

Android 媒体记录器对于此类事情的鲁棒性非常低。

所以删除上面写着的那一行

mMediaRecorder.setOutputFormat();

并且错误应该消失。顺便说一句。删除

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

mMediaRecorder.setProfile() 也已经这样做了。

【讨论】:

  • 使用 mMediaRecorder.setProfile() 时可以设置 setVideoFrameRate 吗?
  • 可能是的。视频帧速率是摄像机配置文件的一部分,因此您无需设置它,但根据我过去的经验,大多数相机仅将帧速率用作最大值,实际帧速率由相机本身设置根据实际情况,例如可用的光线。所以这个参数对于刻录机启动是否成功是相当不重要的。
  • 你是个天才。即使在阅读了谷歌的所有官方文档之后,也令人费解。是的,recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)) 已经为您设置了 AudioEncoder 和 VideoEncoder。
【解决方案2】:

您可能需要在 MediaRecorder 启动之前释放相机对象,例如:

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

在启动 MediaRecorder 方法之前调用上述方法。

重要提示:此外,必须按此顺序调用以下方法:

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

这里的重要位是 setVideoEncodersetAudioEncoder 被最后调用。

【讨论】:

  • 如果 camera =null ,如何录制视频?
  • 不,我的意思是在mMediaRecorder.start(); 之前执行上述操作。我从您的帖子中看不到您声明了此方法。但没有它就行不通。
  • 如果我关闭 3 行: setOutputFormat,setAudioEncoder,setVideoEncoder ,它会工作,但我想为他们设置。
  • 非法状态异常:它不允许设置相同的我的代码。
  • 啊,我明白了。您可能需要在 try/catch 中移动 mMediaRecorder 的方法并查看返回的错误(如果有)。您提到的三种方法将取决于 Android API 以及您的设备在物理上是否支持这些方法中声明的模式。您最终可能会包含另一个第三方库来做您想做的事情,例如ffmpeg.
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 2011-07-07
  • 2018-09-02
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
相关资源
最近更新 更多