We can take
video from android default intent also but customization becomes impossible as it has its own limitation. So we need to make our own
camera application in android to capture video. It will work as camcorder also. Making camera application in android , is bit complicated task if we do not understand it step by step
It need these three thing
- SurfaceView to give one platform to show material
- Camera to show material on surface provided by surfaceview
- And a media recorder to record the video provided by camera and surface view
So let make one layout, which have one surfaceview class inside it and start with surfaceview
- surfaceview called surfaceCreated(SurfaceHolder arg0) very first time. So we need to open camera here. Handle the case where camera is not able to work properly
@Override
public void surfaceCreated(SurfaceHolder arg0) {
camera = openFrontFacingCamera();
if (camera != null) {
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
camera.release();
camera = null;
}
} else {
Toast.makeText(act, "Problem in opening Camera.", Toast.LENGTH_LONG)
.show();
act.finish();
}
}
- Now camera is ready. Once surfaceChanged(SurfaceHolder arg0, int format, int height,int width), we will instantiate the MediaRecorder and attach all thing to capture video properly. It important to remember that camera attribute is need to be set in a order but their value may differ
@Override
public void surfaceChanged(SurfaceHolder arg0, int format, int height,
int width) {
Camera.Size previewSize = null;
try {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> supportSize = parameters
.getSupportedPreviewSizes();
if (supportSize != null) {
previewSize = getOptimalPreviewSize(supportSize, width, height);
}
parameters.setPreviewSize(previewSize.width, previewSize.height);
parameters.set("orientation", "portrait");
camera.setPreviewDisplay(arg0);
camera.setParameters(parameters);
camera.startPreview();
camera.unlock();
m_recorder.setPreviewDisplay(arg0.getSurface());
m_recorder.setCamera(camera);
m_recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
m_recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
m_recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
m_recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
m_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
m_recorder.setMaxDuration(90000);
m_recorder.setOnInfoListener(oninfoLis);
m_recorder.setVideoSize(previewSize.width, previewSize.height);
m_recorder.setVideoFrameRate(30);
m_recorder.setVideoEncodingBitRate(500);
m_recorder.setAudioEncodingBitRate(128);
m_recorder.setOutputFile("/mnt/sdcard/myfile"
+ SystemClock.elapsedRealtime() + ".mp4");
m_recorder.prepare();
m_recorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.getMessage();
}
}
- But most important is to get optimal preview display to camera. For one device there may be more than one preview display so we need use best among them to capture good quality video
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
So this article shows how to capture video with out default intent. Video quality may vary according to device resolution. and you need to set Video Frame Rate according to you device type. I have found this limit on android developer site
| SD (Low quality) | SD (High quality) | HD (Not available on all devices) |
Video codec | H.264 Baseline Profile | H.264 Baseline Profile | H.264 Baseline Profile |
Video resolution | 176 x 144 px | 480 x 360 px | 1280 x 720 px |
Video frame rate | 12 fps | 30 fps | 30 fps |
Video bitrate | 56 Kbps | 500 Kbps | 2 Mbps |
Audio codec | AAC-LC | AAC-LC | AAC-LC |
Audio channels | 1 (mono) | 2 (stereo) | 2 (stereo) |
Audio bitrate | 24 Kbps | 128 Kbps | 192 Kbps |
No comments:
Post a Comment
Feedback always help in improvement. If you have any query suggestion feel free to comment and Keep visiting my blog to encourage me to blogging