【问题标题】:IllegalStateException when reusing MediaRecorder instance重用 MediaRecorder 实例时出现 IllegalStateException
【发布时间】:2015-10-22 18:02:00
【问题描述】:

嘿,我正在尝试让 MediaRecorder 记录我屏幕上的内容。当我第一次录制时它可以工作,但是当我第二次尝试录制屏幕时它失败了。以下是相关代码:

void startRecording(String directory,String filename,MediaProjection mediaProjection) {
    this.mediaProjection=mediaProjection;
    this.directory=directory;
    this.filename=filename;
    initRecorder();
    prepareRecorder();
    virtualDisplay = createVirtualDisplay();
    mediaRecorder.start();
}

void stopRecording() {
    mediaRecorder.stop();
    mediaRecorder.reset();
    if (virtualDisplay != null) {
        virtualDisplay.release();
    }
    if (mediaProjection != null) {
        mediaProjection.stop();
        mediaProjection = null;
    }
    initRecorder();
    prepareRecorder();

}

void setScreen(int screenWidth, int screenHeight, int screenDensity) {
    this.screenWidth = screenWidth;
    this.screenHeight = screenHeight;
    this.screenDensity = screenDensity;
}

void prepareRecorder() {
    try {
        mediaRecorder.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

void initRecorder() {
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mediaRecorder.setVideoEncodingBitRate(512 * 1000);
    mediaRecorder.setVideoFrameRate(30);
    mediaRecorder.setVideoSize(screenWidth, screenHeight);
    mediaRecorder.setOutputFile(directory + "/" + filename + ".mp4");
    //mediaRecorder.setOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath()+"/vitalij.mp4");
}

所以在我的活动中,我创建了一个此类的新实例,然后在按下按钮后调用 startRecording 方法。然后用户可以按调用 stopRecording 方法的停止录制。当应用程序被销毁时,我释放 mediaRecorder 对象。 这是我得到的错误:

 Caused by: java.lang.IllegalStateException
        at android.media.MediaRecorder.setAudioSource(Native Method)
        at com.example.xxx.myapplication.VideoRecorder.initRecorder(VideoRecorder.java:77)
        at com.example.xxx.myapplication.VideoRecorder.startRecording(VideoRecorder.java:30)
        at com.example.xxx.myapplication.MainActivity.onActivityResult(MainActivity.java:134)

我确定我设置了正确的权限,并且第一个视频可以正常创建。仅在第二次录制时才会出现此问题。

【问题讨论】:

    标签: android mediarecorder android-mediarecorder android-mediaprojection


    【解决方案1】:

    问题是你正在执行这两行代码:

    initRecorder();
    prepareRecorder();
    

    在您的 stopRecording() 函数的末尾,再次在您的 startRecording() 函数中。

    当您在设置音频源后尝试在initRecorder() 中调用mediaRecorder.setAudioSource 时,您会得到一个IllegalStateException,因为它处于不正确的状态。

    如果您查看the Android MediaRecorder reference page 上的状态图,您会看到MediaRecorder 必须处于Initial 状态才能调用setAudioSource(),但在调用stopRecording() 之后您的处于Prepared 状态然后你尝试再次拨打setAudioSource()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2019-06-26
      • 2015-11-01
      相关资源
      最近更新 更多