Reputation: 7976
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
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