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