CamcorderProfile.QUALITY_HIGH resolution produces green flickering video
I came across this question trying to solve the same problem.
A solution is given over on xda developer http://forum.xda-developers.com/showthread.php?t=1104970&page=8. It seems that you need to set an obscure parameter "cam_mode" for high definition recording to work:
camera = Camera.open();Camera.Parameters param = camera.getParameters();param.set( "cam_mode", 1 ); camera.setParameters( param );
In mediarecorder, you can then use
mediarecorder.setVideoSize(1920, 1080);
although this will now also work:
mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
(The latter seems to have a video bitrate of 20Mb/s, so you might want to take that down a bit!) I found that I didn't have to set the preview size to 1920x1080.
(edit) You also need to set
parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
or
param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
otherwise you get a delay of a few seconds before the camera starts!
As to why Samsung has implemented the Camera in this way, I have no idea. It's certainly not developer friendly!
Here is how I managed to make this work on Samsung Galaxy S2. The critical point here is to set the same resolution both in camera parameters and recorder video size. Also, already mentioned 'cam_mode' hack is required. So, I allowed a user to select from three quality modes: low (800x480), medium(1280x720), and high(1920x1080):
enum InternalCameraQuality { LOW, MEDIUM, HIGH}
and when creating/populating camera and recorder I did
// signature types are irrelevant hereFile start(DeviceHandler handler, FileHelper fh) throws IOException { file = fh.createTempFile(".mp4"); camera = Camera.open(); setCameraParameters(camera); camera.setPreviewDisplay(getHolder()); camera.unlock(); recorder = new MediaRecorder(); recorder.setCamera(camera); setRecorderParameters(recorder); recorder.prepare(); recorder.start(); return file;}void setCameraParameters(Camera camera) { Camera.Parameters param = camera.getParameters(); // getParams() simply returns some field holding configuration parameters // only the 'quality' parameter is relevant here if (getParams().quality != InternalCameraQuality.LOW) { // Samsung Galaxy hack for HD video param.set("cam_mode", 1); } Pair<Integer, Integer> resolution = getResolution(getParams().quality); param.setPreviewSize(resolution.first, resolution.second); param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); camera.setParameters(param);}void setRecorderParameters(MediaRecorder recorder) { recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); Pair<Integer, Integer> resolution = getResolution(getParams().quality); CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); profile.videoFrameWidth = resolution.first; profile.videoFrameHeight = resolution.second; recorder.setProfile(profile); recorder.setOutputFile(file.getAbsolutePath()); recorder.setPreviewDisplay(getHolder().getSurface());}Pair<Integer, Integer> getResolution(InternalCameraQuality quality) { final int width, height; switch (quality) { case LOW: width = 800; height = 480; break; case MEDIUM: width = 1280; height = 720; break; case HIGH: width = 1920; height = 1080; break; default: throw new IllegalArgumentException("Unknown quality: " + quality.name()); } return Pair.create(width, height);}
Note that you must use the 'cam_mode' hack only for medium and high quality, otherwise green flickering will appear in low quality mode. Also you may wish to customize some other profile settings if you need.
Hope, that helped.
List<Size> ls = parameters.getSupportedPreviewSizes(); Size size = ls.get(1); sizes 1 ----------960 720 sizes 2 ----------800 480 sizes 3 ----------720 480 sizes 5 -----------640 384 sizes 6 ----------576 432 sizes 7 ----------480 320
this are the list of sizes and more in android.