Android 视频录制
Android 使用MediaRecorder录制视频步骤:
1.Activity实现SurfaceHolder.Callback接口
public class MyActivity extends Activity implements SurfaceHolder.Callback {
private SurfaceHolder surfaceHolder;
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
surfaceHolder = holder;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
surfaceHolder = holder;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//释放资源的代码
}
}
2.点击开始按钮时创建MediaRecorder并录制。页面中创建SurfaceView用于预览视频。
//声明类变量
private MediaRecorder mediaRecorder;
private Camera camera;
//以下代码写在触发的事件中。
mediaRecorder = new MediaRecorder();
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
if (camera != null) {
//将视频旋转90度
camera.setDisplayOrientation(90);
camera.unlock();
mediaRecorder.setCamera(camera);
}
//将视频旋转90度
mediaRecorder.setOrientationHint(90);
// 音频源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
// 视频源
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 视频格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//视频编码
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//音频编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //不要使用AMR_NB,HTML5中播放不出声音。
//分辨率。必须放在设置编码和格式的后面,否则报错
mediaRecorder.setVideoSize(320, 240);
//视频帧率。必须放在设置编码和格式的后面,否则报错
mediaRecorder.setVideoFrameRate(29);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
// 视频文件输出的路径
String videoPath = getExternalFilesDir(Environment.DIRECTORY_DCIM).getPath() + "/" + System.currentTimeMillis() + ".mp4";
mediaRecorder.setOutputFile(videoPath);
try {
// 准备录制
mediaRecorder.prepare();
// 开始录制
mediaRecorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3.释放资源,点停止按钮或surfaceDestroyed方法中调用。
surfaceView = null;
surfaceHolder = null;
if (mediaRecorder != null) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
f(camera != null) {
camera.lock();
camera.release();
camera = null;
}