- Create a layout for video capture
- Create a button for video recording start and stop
mVideoRecording.setOnClickListener(
new Button.OnClickListener() {
new Button.OnClickListener() {
@Override
public void onClick(View v) {
if (mIsRecordingVideo == false) {
mVideoRecording.setText(
R.string.video_recording_stop);
R.string.video_recording_stop);
videoRecordingStart();
} else {
videoRecordingStop();
}
}
});
- Create a preview surface view and surface holder
mPreview = (SurfaceView) findViewById(
R.id.video_capture_view);
R.id.video_capture_view);
SurfaceHolder holder = mPreview.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- Stop video recording on activity pause
public void onPause() {
...
if (mIsRecordingVideo == true) {
videoRecordingStop();
...
...
- Search for front facing camera and set orientation
CameraInfo camerainfo = new Camera.CameraInfo();
for (int index = 0;
index < Camera.getNumberOfCameras();
index++) {
index < Camera.getNumberOfCameras();
index++) {
Camera.getCameraInfo(index, camerainfo);
if (camerainfo.facing ==
Camera.CameraInfo.CAMERA_FACING_FRONT) {
Camera.CameraInfo.CAMERA_FACING_FRONT) {
try {
mCamera = Camera.open(index);
mCameraOrientation =
(camerainfo.orientation + 0) % 360;
(camerainfo.orientation + 0) % 360;
mCameraOrientation = (360 - mCameraOrientation);
mCamera.setDisplayOrientation(
mCameraOrientation);
mCameraOrientation);
Camera.Parameters cameraparameters =
mCamera.getParameters();
mCamera.getParameters();
cameraparameters.setRotation(
camerainfo.orientation);
camerainfo.orientation);
mCamera.setParameters(cameraparameters);
} catch (RuntimeException e) {
Log.i(mTAG, e.getMessage(), e);
}
}
}
- Search for back facing camera and set orientation
for (int index = 0;
index < Camera.getNumberOfCameras();
index++) {
index++) {
Camera.getCameraInfo(index, camerainfo);
if (camerainfo.facing ==
Camera.CameraInfo.CAMERA_FACING_BACK) {
Camera.CameraInfo.CAMERA_FACING_BACK) {
try {
mCamera = Camera.open(index);
mCameraOrientation =
(camerainfo.orientation + 0) % 360;
(camerainfo.orientation + 0) % 360;
mCamera.setDisplayOrientation(
mCameraOrientation);
mCameraOrientation);
Camera.Parameters cameraparameters =
mCamera.getParameters();
mCamera.getParameters();
cameraparameters.setRotation(
camerainfo.orientation);
camerainfo.orientation);
mCamera.setParameters(cameraparameters);
} catch (RuntimeException e) {
Log.i(mTAG, e.getMessage(), e);
}
}
}
- Start camera preview and unlock
mCamera.unlock();
- Generate mp4 file name for video recording
String path = null;
File dir = null;
String name = null;
try {
path = String.format(getExternalFilesDir(null).
getPath().toString());
getPath().toString());
dir = new File(path);
if (!dir.exists())
dir.mkdirs();
MP4FileFilter filter = new MP4FileFilter();
File[] files = dir.listFiles(filter);
if (files != null) {
for (File file : files) {
file.delete();
}
}
name = String.format("/%d.mp4",
System.currentTimeMillis());
System.currentTimeMillis());
} catch(Exception e) {
Log.i(mTAG, e.getMessage(), e);
}
- Create media recorder and setting up
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setVideoSource(
MediaRecorder.VideoSource.CAMERA);
MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setAudioSource(
MediaRecorder.AudioSource.MIC);
MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(
MediaRecorder.OutputFormat.MPEG_4);
MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(
MediaRecorder.VideoEncoder.H264);
MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(
MediaRecorder.AudioEncoder.AAC);
MediaRecorder.AudioEncoder.AAC);
if ((path != null) && (name != null)) {
mVideoRecordingPath = path + name;
mMediaRecorder.setOutputFile(new File(path,
name).getAbsolutePath());
name).getAbsolutePath());
mMediaRecorder.setVideoSize(640, 480);
mMediaRecorder.setVideoFrameRate(15);
}
- Stop camera preview and release
mCamera.stopPreview();
mCamera.release();
- Stop media recorder and release
mMediaRecorder.stop();
...
...
mMediaRecorder.release();
- Save video file path and video volume for later use
SharedPreferences preferences = getApplicationContext().
getSharedPreferences("VideoRecording",
MODE_PRIVATE);
getSharedPreferences("VideoRecording",
MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString("video_path", mVideoRecordingPath);
AudioManager audioManager = (AudioManager)
getApplicationContext().
getSystemService(Context.AUDIO_SERVICE);
getApplicationContext().
getSystemService(Context.AUDIO_SERVICE);
mVideoVolume = audioManager.getStreamVolume(
AudioManager.STREAM_MUSIC);
AudioManager.STREAM_MUSIC);
editor.putInt("video_volume", mVideoVolume);
editor.commit();
- Remove title bar
requestWindowFeature(Window.FEATURE_NO_TITLE);
- Set full screen display and keep screen on getWindow().addFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN);
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- Sample code for android video recording:
import java.io.FileFilter;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.media.AudioManager;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
public class VideoRecordingActivity extends Activity {
private final String mTAG = "VideoRecordingActivity";
private Button mVideoRecording;
private boolean mIsRecordingVideo = false;
private SurfaceView mPreview;
private MediaRecorder mMediaRecorder;
private Camera mCamera;
private int mCameraOrientation = 0;
private String mVideoRecordingPath;
private int mVideoVolume;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.video_capture);
setContentView(R.layout.video_capture);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mVideoRecording = (Button)findViewById(
R.id.video_recording);
mVideoRecording.setOnClickListener(new Button.
OnClickListener() {
OnClickListener() {
@Override
public void onClick(View v) {
if (mIsRecordingVideo == false) {
mVideoRecording.setText(
R.string.video_recording_stop);
R.string.video_recording_stop);
videoRecordingStart();
} else {
videoRecordingStop();
}
}
});
mPreview = (SurfaceView) findViewById(
R.id.video_capture_view);
R.id.video_capture_view);
SurfaceHolder holder = mPreview.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void onPause() {
super.onPause();
if (mIsRecordingVideo == true) {
videoRecordingStop();
}
}
private void videoRecordingStart() {
CameraInfo camerainfo = new Camera.CameraInfo();
for (int index = 0;
index < Camera.getNumberOfCameras();
index++) {
index < Camera.getNumberOfCameras();
index++) {
Camera.getCameraInfo(index, camerainfo);
if (camerainfo.facing ==
Camera.CameraInfo.CAMERA_FACING_FRONT) {
Camera.CameraInfo.CAMERA_FACING_FRONT) {
try {
mCamera = Camera.open(index);
mCameraOrientation =
(camerainfo.orientation + 0) % 360;
(camerainfo.orientation + 0) % 360;
mCameraOrientation =
(360 - mCameraOrientation);
(360 - mCameraOrientation);
mCamera.setDisplayOrientation(
mCameraOrientation);
mCameraOrientation);
Camera.Parameters cameraparameters =
mCamera.getParameters();
mCamera.getParameters();
cameraparameters.setRotation(
camerainfo.orientation);
camerainfo.orientation);
mCamera.setParameters(cameraparameters);
} catch (RuntimeException e) {
Log.i(mTAG, e.getMessage(), e);
}
}
}
if (mCamera == null) {
for (int index = 0;
index < Camera.getNumberOfCameras();
index++) {
index < Camera.getNumberOfCameras();
index++) {
Camera.getCameraInfo(index, camerainfo);
if (camerainfo.facing ==
Camera.CameraInfo.CAMERA_FACING_BACK) {
Camera.CameraInfo.CAMERA_FACING_BACK) {
try {
mCamera = Camera.open(index);
mCameraOrientation =
(camerainfo.orientation + 0) % 360;
(camerainfo.orientation + 0) % 360;
mCamera.setDisplayOrientation(
mCameraOrientation);
mCameraOrientation);
Camera.Parameters cameraparameters =
mCamera.getParameters();
mCamera.getParameters();
cameraparameters.setRotation(
camerainfo.orientation);
camerainfo.orientation);
mCamera.setParameters(cameraparameters);
} catch (RuntimeException e) {
Log.i(mTAG, e.getMessage(), e);
}
}
}
}
if (null != mCamera) {
mCamera.startPreview();
mCamera.unlock();
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setVideoSource(
MediaRecorder.VideoSource.CAMERA);
MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setAudioSource(
MediaRecorder.AudioSource.MIC);
MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(
MediaRecorder.OutputFormat.MPEG_4);
MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(
MediaRecorder.VideoEncoder.H264);
MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(
MediaRecorder.AudioEncoder.AAC);
MediaRecorder.AudioEncoder.AAC);
String path = null;
File dir = null;
String name = null;
try {
path = String.format(getExternalFilesDir(null).
getPath().toString());
getPath().toString());
dir = new File(path);
if (!dir.exists())
dir.mkdirs();
MP4FileFilter filter = new MP4FileFilter();
File[] files = dir.listFiles(filter);
if (files != null) {
for (File file : files) {
file.delete();
}
}
name = String.format("/%d.mp4",
System.currentTimeMillis());
System.currentTimeMillis());
} catch(Exception e) {
Log.i(mTAG, e.getMessage(), e);
}
if ((path != null) && (name != null)) {
mVideoRecordingPath = path + name;
mMediaRecorder.setOutputFile(new File(path,
name).getAbsolutePath());
name).getAbsolutePath());
mMediaRecorder.setVideoSize(640, 480);
mMediaRecorder.setVideoFrameRate(15);
mMediaRecorder.setPreviewDisplay(
mPreview.getHolder().getSurface());
mPreview.getHolder().getSurface());
mMediaRecorder.setOrientationHint(
mCameraOrientation);
mCameraOrientation);
mMediaRecorder.setMaxDuration(60000);
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IllegalStateException e) {
Log.i(mTAG, e.getMessage(), e);
} catch (IOException e) {
Log.i(mTAG, e.getMessage(), e);
}
mIsRecordingVideo = true;
}
}
}
private class MP4FileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
if (pathname.getName().toLowerCase().
endsWith(".mp4")) {
endsWith(".mp4")) {
return true;
}
return false;
}
}
private void videoRecordingStop() {
if (mIsRecordingVideo) {
mMediaRecorder.stop();
mCamera.stopPreview();
mCamera.release();
mMediaRecorder.release();
SharedPreferences preferences =
getApplicationContext().getSharedPreferences(
"VideoRecording", MODE_PRIVATE);
getApplicationContext().getSharedPreferences(
"VideoRecording", MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString("video_path", mVideoRecordingPath);
AudioManager audioManager = (AudioManager)
getApplicationContext().getSystemService(
Context.AUDIO_SERVICE);
getApplicationContext().getSystemService(
Context.AUDIO_SERVICE);
mVideoVolume = audioManager.getStreamVolume(
AudioManager.STREAM_MUSIC);
AudioManager.STREAM_MUSIC);
editor.putInt("video_volume", mVideoVolume);
editor.commit();
mIsRecordingVideo = false;
finish();
}
}
}
沒有留言:
張貼留言