【问题标题】:IllegalStateException with MediaRecorder.start() : null带有 MediaRecorder.start() 的 IllegalStateException:null
【发布时间】:2018-03-09 17:41:25
【问题描述】:

我正在尝试创建一个简单的录像机,这是我的代码,以便我调用它:

protected boolean prepareForVideoRecording() {
    try {
        mCamera.unlock();
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
        mMediaRecorder.setOutputFile(getOutputMediaFile1(MEDIA_TYPE_VIDEO).toString());
        mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
        try {
            mMediaRecorder.prepare();
            Toast.makeText(getContextOfMainFragment(), "Prepared!", Toast.LENGTH_SHORT).show();
        } catch (IllegalStateException e) {
            Log.e(TAG,"IllegalStateException when preparing MediaRecorder "+ e.getMessage());
            e.getStackTrace();
            releaseMediaRecorder();
            return false;
        } catch (IOException e) {
            Log.e(TAG,"IOException when preparing MediaRecorder "+ e.getMessage());
            e.getStackTrace();
            releaseMediaRecorder();
            return false;
        }
        return true;

    } catch (Exception e) {
        return false;
    }
}

请忽略 toast 消息,我有时会使用它们进行调试。接下来,唯一剩下的就是调用 mMediaRecorder.start() 我通过单击按钮执行此操作。事实上,我添加了 2 个按钮,第一个按钮调用上面的方法,另一个按钮调用 start。我确信这个相同的代码曾经对我有用,我不知道为什么它不再工作了。

我在我的 mMediaRecorder.start() 调用周围添加了一个尝试捕获,带有 IllegalStateException,这就是我得到的:

04-09 10:38:18.350: E/MediaRecorder(29678): start failed: -38
04-09 10:38:18.350: E/VideoTut_Main(29678): Illegal state exception with MediaRecorder.Start() :  null

【问题讨论】:

  • 我有一个更新:我试图将其安装在 Nexus 5 上。出于好奇,我尝试将其安装在三星 Galaxy s3 上,它运行良好。我不确定为什么它不能在 Nexus 5 上运行。我还尝试卸载并再次安装它。还是不行。 :(

标签: android illegalstateexception mediarecorder android-mediarecorder


【解决方案1】:

我在blog 中写了一篇关于此类问题的长文。总结一下,有(至少据我所知)三种方法来设置 Android 媒体记录器,对于每种方法,我手上都有一个设备,但这种方法不起作用。因此,您需要用户尝试在他的设备上使用哪种方法。方法如下:

  1. 对视频大小、预览大小等使用设备默认设置,但在媒体记录器中将视频大小明确设置为您在开始之后后从相机参数中获得的预览大小预览窗口,但解锁相机进行录制之前。
  2. 像在代码中那样使用摄像机配置文件。它应该可以在大多数具有 Android 4.0 及更高版本的设备上完美运行。不过,我建议设置最大文件大小和视频长度,但怀疑这是 Nexus 5 的问题。而且我知道至少有一台其他设备(Xperia ray 升级到最新固件版本)也不能正常工作。
  3. 使用您从摄像头参数getSupportedVideoSizes() 获得的显式视频尺寸之一。

方法 1. 和 3. 需要明确设置输出格式、音频编码器和视频编码器,我总是使用 MediaRecorder.OutputFormat.THREE_GPPMediaRecorder.AudioEncoder.AMR_NBMediaRecorder.VideoEncoder.MPEG_4_SP

我在 Google Play 中有一个名为 Video Timer 的小型免费应用程序,它实现了所有三种方法,因此您可以轻松尝试在 Nexus 5 上有效的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2015-12-18
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多