Can't set video quality for media recorder.video produces flickering video

android, android-mediarecorder, surfaceholder

Solution

I'm not a Java/Android dev, I'm using Xamarin and C#, but I had much the same problem, and my solution should be directly applicable (even the syntax is almost identical).

I found that if you're using `setCamera` (and are previewing what the camera sees before you start up your mediaRecorder) then it won't let you change the quality settings on the `mediaRecorder`.

And then when you call `mediaRecorder.start()`, it either crashes or freezes or displays garbage.

Basically, as long as the Camera is previewing, the MediaRecorder won't be allowed to start recording at a different quality to that which the camera already has. You need to

- stop the camera preview,

- take away its preview surface

- assign the camera to the MediaRecorder (with `setCamera`)

- set the MediaRecorder up with the quality you need

- then reattach the preview surface

Then when you start recording, everything works as it should.

So in your case, just before you call `mediaRecorder.setCamera()`, try the following:

` mCamera.stopPreview(); mCamera.setPreviewDisplay(null); `

Then further down, do your

`mRecorder.setCamera()`

That was the solution for me. I can now set the video quality to 720p (or 1080p) and it works perfectly.

However, when you stop recording, your previewing will also stop.

You'll probably need to reinstate your

`mCamera.setPreviewDisplay(mPreview.getHolder().getSurface())`

to what it was before, and restart the actual preview.

I hope it works for you too :)

Problem

``` mMediaRecorder = new MediaRecorder(); // Step 1: Unlock and set camera to MediaRecorder mCamera.unlock(); mMediaRecorder.setCamera(mCamera); // Step 2: Set sources // activate this for recording with sound\ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoSize(getMaxSupportedVideoSize().width,getMaxSupportedVideoSize().height); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // Step 4: Set output file mMediaRecorder.setOutputFile(getOutputMediaFile("movie")); // Step 4: Set output file mMediaRecorder.setOutputFile(getOutputMediaFile("movie")); // Step 5: Set the preview output mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); mMediaRecorder.setOrientationHint(90); ``` above code is working fine But, the quality of video is not as same as video i shoot over native android camera, my video recorded using media recorder is poor quality compare to the native one, how can i improve the video quality. If any one knows help me out.Thanks

Original source