Huy Tower
Huy Tower

Reputation: 7976

IllegalStateException was happen when try to set Encoder for Media Recorder

Currently I'm working with Custom Camera for Recording video.

I already completed Take Picture from Camera feature correctly.

I'm trying making Recording Video from Camera feature work also.

Actually, If I don't try to set Encoder for video, it worked.

But I want customize Recording Video feature, so I already set Encoder for Media Recorder and always get IllegalStateException.

So the thing I want is : Can set encoder, both audio encoder and video encoder for video completely without happened exception.

People who know how,

Please tell me,

Really thank you,

Below is the codes.

private boolean prepareVideoRecorder(int mode){
        // Should release before use new Preview for Recording Video mode
        CustomCamera.releaseCamera();

        // Initialize camera
        CustomCamera.mCamera = CustomCamera.getCameraInstance(mode);

        // Set orientation display
        CustomCamera.setCameraDisplayOrientation(getActivity(), mode);

        // Should release before use new Preview for Recording Video mode
        CustomCamera.releaseMediaRecorder();

        CustomCamera.mMediaRecorder = new MediaRecorder();

        // Step 1: Unlock and set camera to MediaRecorder
        CustomCamera.mCamera.unlock();
        CustomCamera.mMediaRecorder.setCamera(CustomCamera.mCamera);

        // Step 2: Set sources
        CustomCamera.mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        CustomCamera.mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        // THESE LINES GET CRASH
        CustomCamera.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        CustomCamera.mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);

        // todo Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
        CustomCamera.mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

        // Step 4: Set output file
        CustomCamera.mMediaRecorder.setOutputFile(getOutputMediaFile(MediaType.VIDEO).toString());

        // Step 5: Set the preview output
        CustomCamera.mMediaRecorder.setPreviewDisplay(mCameraPreview.getHolder().getSurface());


        // Step 6: Prepare configured MediaRecorder
        try {
            CustomCamera.mMediaRecorder.prepare();

            CustomCamera.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        } catch (IllegalStateException e) {
            e.printStackTrace();
            CustomCamera.releaseMediaRecorder();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            CustomCamera.releaseMediaRecorder();
            return false;
        }
        return true;
    }

p/s :

Although I set these lines

CustomCamera.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        CustomCamera.mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);

before or after method setProfile (or setOutputFile) still get this Exception.

Here is thrown exception :

    > I/MediaRecorderJNI﹕ prepare: surface=0x1cf9610 (identity=373)
    E/MediaRecorder﹕ audio encoder has already been set
 java.lang.IllegalStateException
    at android.media.MediaRecorder.setAudioEncoder(Native Method)
    at ui.fragment.custom.camera.CameraPreviewFragment.prepareVideoRecorder(CameraPreviewFragment.java:469)
    at ui.fragment.custom.camera.CameraPreviewFragment.onClick(CameraPreviewFragment.java:203)
    at android.view.View.performClick(View.java:3574)
    at android.view.View$PerformClick.run(View.java:14293)
    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:4448)
    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:823)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
     at dalvik.system.NativeStart.main(Native Method)

SOLUTION

Set below codes after setProfile() method

 CustomCamera.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    CustomCamera.mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);

And remove the line .setAudioEncoder(MediaRecorder.AudioEncoder.AAC); in try-catch exception. It work correctly.

Upvotes: 1

Views: 2633

Answers (1)

AlexMasca
AlexMasca

Reputation: 403

Remove the CustomCamera.mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); line from try catch because there you try to set the AudioEncoder again thus the exception.

EDIT And set Encoder after setProfile() method, it is correct.

Upvotes: 1

Related Questions