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;
}