Android调用系统摄像头--使用MediaRecorder--2--使用MediaRecorder进行录制

准备好了预览(preview)之后,就可以使用MediaRecorder进行视频录制了,付上录制部分的代码

public class AndroidCameraActivity extends Activity {
    private static final String TAG = "TAG-AndroidCameraActivity";
	
    public static final int MEDIA_TYPE_IMAGE = 1; 
    public static final int MEDIA_TYPE_VIDEO = 2; 
	
    private Camera mCamera; 
    private CameraPreview mPreview; 
    
    
    private Button captureButton;
    
    private MediaRecorder mMediaRecorder; 
    
    private boolean isRecording = false; 
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // 创建Camera实例 
        mCamera = getCameraInstance(); 

        // 创建Preview view并将其设为activity中的内容
        mPreview = new CameraPreview(this, mCamera); 
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
        preview.addView(mPreview); 
        
        // 为Capture按钮加入listener,拍摄视频
 	captureButton = (Button) findViewById(R.id.button_capture); 
 	captureButton.setOnClickListener(new View.OnClickListener() {

 			@Override
 			public void onClick(View v) {
 				if (isRecording) {
 					// 停止录像,释放camera
 					mMediaRecorder.stop(); 
 					releaseMediaRecorder(); 

 					mCamera.lock(); 

 					// 通知用户录像已停止
 					captureButton.setText("开始录像");

 					isRecording = false;
 				} else {
 					// 初始化视频camera
 					if (prepareVideoRecorder()) {
 						mMediaRecorder.start();

 						// 通知用户录像已开始 
 						captureButton.setText("停止录像");

 						isRecording = true;
 					} else {
 						// 准备未能完成,释放camera
 						releaseMediaRecorder();
 					}
 				}
 			}
 		});
	}
	
    @Override 
    protected void onPause() { 
        super.onPause(); 
        // 如果正在使用MediaRecorder,首先需要释放它。
        releaseMediaRecorder(); 
        // 在暂停事件中立即释放摄像头
        releaseCamera();
    } 
	
	private void releaseMediaRecorder() {
		if (mMediaRecorder != null) {
			// 清除recorder配置
			mMediaRecorder.reset(); 
			// 释放recorder对象
			mMediaRecorder.release(); 

			mMediaRecorder = null;
			// 为后续使用锁定摄像头
			mCamera.lock(); 
		}
	}

	private void releaseCamera() {
		if (mCamera != null) {
			// 为其它应用释放摄像头
			mCamera.release(); 
			mCamera = null;
		}
	}

	private boolean prepareVideoRecorder() {

		mMediaRecorder = new MediaRecorder();

		// 第1步:解锁并将摄像头指向MediaRecorder
		mCamera.unlock();
		mMediaRecorder.setCamera(mCamera);

		// 第2步:指定源
		mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
		mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

		// 第3步:指定CamcorderProfile(需要API Level 8以上版本)
//		mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
	        // 第3步:设置输出格式和编码格式(针对低于API Level 8版本)
	        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
	        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
	        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);


		// 第4步:指定输出文件
		mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

		// 第5步:指定预览输出
		mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

		// 第6步:根据以上配置准备MediaRecorder
		try {
			mMediaRecorder.prepare();
		} catch (IllegalStateException e) {
			Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
			releaseMediaRecorder();
			return false;
		} catch (IOException e) {
			Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
			releaseMediaRecorder();
			return false;
		}
		return true;
	}
	
    private Camera getCameraInstance(){ 
        Camera c = null; 

        try { 
            // 获取Camera实例
            c = Camera.open(); 
        } catch (Exception e){ 
            // 摄像头不可用(正被占用或不存在)
        } 
        // 不可用则返回null
        return c; 
    }
    
	private File getOutputMediaFile(int type) {
	    // ......生成媒体文件,如xxx.mp4......
	}
	
	private boolean checkCameraHardware(Context context) { 
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ 
            // 摄像头存在 
            return true; 
        } else { 
            // 摄像头不存在 
            return false; 
        } 
    }
}

根据Android官方文档,在使用MediaRecorder进行视频录制的时候一定要严格遵循上面的顺序,否则会报错

在API里到处是“if it is called before setOutputFormat() or after prepare() ”因此一定要严格的按照顺序来进行摄像头操作


你可能感兴趣的:(Android)