0

Hey I'm trying to make MediaRecorder record the contents of my screen. It works when I'm making a recording for a first time but when I try to record the screen for a second time it fails. Here is relevant code:

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

So in my activity I create a new instance of this class once then after pressing the button the startRecording method get's invoked. Then user can press stop recording which calls stopRecording method. When app is destroyed i release the mediaRecorder object. This is the error I get:

 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)

I'm sure that I have the correct permissions set and the first video gets created fine. The problem only occurs when making the recording for a second time.

John Smith
  • 844
  • 8
  • 26

1 Answers1

1

The issue is that you're executing these two lines of code:

initRecorder();
prepareRecorder();

at the end of your stopRecording() function and again in your startRecording() function.

When you try to call mediaRecorder.setAudioSource in initRecorder() after the audio source has already been set, you get an IllegalStateException because it's in the incorrect state.

If you look at the state diagram on the Android MediaRecorder reference page, you'll see that a MediaRecorder must be in the Initial state to call setAudioSource(), but yours is in the Prepared state after stopRecording() has been called and you try to call setAudioSource() again.

NineToeNerd
  • 307
  • 5
  • 17