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

来源:互联网 发布:淘宝 买折扇推荐 编辑:程序博客网 时间:2024/06/06 05:58

准备好了预览(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步:解锁并将摄像头指向MediaRecordermCamera.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步:根据以上配置准备MediaRecordertry {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() ”因此一定要严格的按照顺序来进行摄像头操作


原创粉丝点击