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

来源:互联网 发布:js加密使用方法 编辑:程序博客网 时间:2024/06/05 02:22

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

[java] view plaincopyprint?
  1. public class AndroidCameraActivity extends Activity {  
  2.     private static final String TAG = "TAG-AndroidCameraActivity";  
  3.       
  4.     public static final int MEDIA_TYPE_IMAGE = 1;   
  5.     public static final int MEDIA_TYPE_VIDEO = 2;   
  6.       
  7.     private Camera mCamera;   
  8.     private CameraPreview mPreview;   
  9.       
  10.       
  11.     private Button captureButton;  
  12.       
  13.     private MediaRecorder mMediaRecorder;   
  14.       
  15.     private boolean isRecording = false;   
  16.       
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.     super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.           
  22.         // 创建Camera实例   
  23.         mCamera = getCameraInstance();   
  24.   
  25.         // 创建Preview view并将其设为activity中的内容  
  26.         mPreview = new CameraPreview(this, mCamera);   
  27.         FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);   
  28.         preview.addView(mPreview);   
  29.           
  30.         // 为Capture按钮加入listener,拍摄视频  
  31.     captureButton = (Button) findViewById(R.id.button_capture);   
  32.     captureButton.setOnClickListener(new View.OnClickListener() {  
  33.   
  34.             @Override  
  35.             public void onClick(View v) {  
  36.                 if (isRecording) {  
  37.                     // 停止录像,释放camera  
  38.                     mMediaRecorder.stop();   
  39.                     releaseMediaRecorder();   
  40.   
  41.                     mCamera.lock();   
  42.   
  43.                     // 通知用户录像已停止  
  44.                     captureButton.setText("开始录像");  
  45.   
  46.                     isRecording = false;  
  47.                 } else {  
  48.                     // 初始化视频camera  
  49.                     if (prepareVideoRecorder()) {  
  50.                         mMediaRecorder.start();  
  51.   
  52.                         // 通知用户录像已开始   
  53.                         captureButton.setText("停止录像");  
  54.   
  55.                         isRecording = true;  
  56.                     } else {  
  57.                         // 准备未能完成,释放camera  
  58.                         releaseMediaRecorder();  
  59.                     }  
  60.                 }  
  61.             }  
  62.         });  
  63.     }  
  64.       
  65.     @Override   
  66.     protected void onPause() {   
  67.         super.onPause();   
  68.         // 如果正在使用MediaRecorder,首先需要释放它。  
  69.         releaseMediaRecorder();   
  70.         // 在暂停事件中立即释放摄像头  
  71.         releaseCamera();  
  72.     }   
  73.       
  74.     private void releaseMediaRecorder() {  
  75.         if (mMediaRecorder != null) {  
  76.             // 清除recorder配置  
  77.             mMediaRecorder.reset();   
  78.             // 释放recorder对象  
  79.             mMediaRecorder.release();   
  80.   
  81.             mMediaRecorder = null;  
  82.             // 为后续使用锁定摄像头  
  83.             mCamera.lock();   
  84.         }  
  85.     }  
  86.   
  87.     private void releaseCamera() {  
  88.         if (mCamera != null) {  
  89.             // 为其它应用释放摄像头  
  90.             mCamera.release();   
  91.             mCamera = null;  
  92.         }  
  93.     }  
  94.   
  95.     private boolean prepareVideoRecorder() {  
  96.   
  97.         mMediaRecorder = new MediaRecorder();  
  98.   
  99.         // 第1步:解锁并将摄像头指向MediaRecorder  
  100.         mCamera.unlock();  
  101.         mMediaRecorder.setCamera(mCamera);  
  102.   
  103.         // 第2步:指定源  
  104.         mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);  
  105.         mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);  
  106.   
  107.         // 第3步:指定CamcorderProfile(需要API Level 8以上版本)  
  108. //      mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));  
  109.             // 第3步:设置输出格式和编码格式(针对低于API Level 8版本)  
  110.             mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);   
  111.             mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);   
  112.             mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);  
  113.   
  114.   
  115.         // 第4步:指定输出文件  
  116.         mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());  
  117.   
  118.         // 第5步:指定预览输出  
  119.         mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());  
  120.   
  121.         // 第6步:根据以上配置准备MediaRecorder  
  122.         try {  
  123.             mMediaRecorder.prepare();  
  124.         } catch (IllegalStateException e) {  
  125.             Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());  
  126.             releaseMediaRecorder();  
  127.             return false;  
  128.         } catch (IOException e) {  
  129.             Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());  
  130.             releaseMediaRecorder();  
  131.             return false;  
  132.         }  
  133.         return true;  
  134.     }  
  135.       
  136.     private Camera getCameraInstance(){   
  137.         Camera c = null;   
  138.   
  139.         try {   
  140.             // 获取Camera实例  
  141.             c = Camera.open();   
  142.         } catch (Exception e){   
  143.             // 摄像头不可用(正被占用或不存在)  
  144.         }   
  145.         // 不可用则返回null  
  146.         return c;   
  147.     }  
  148.       
  149.     private File getOutputMediaFile(int type) {  
  150.         // ......生成媒体文件,如xxx.mp4......  
  151.     }  
  152.       
  153.     private boolean checkCameraHardware(Context context) {   
  154.         if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){   
  155.             // 摄像头存在   
  156.             return true;   
  157.         } else {   
  158.             // 摄像头不存在   
  159.             return false;   
  160.         }   
  161.     }  
  162. }  

根据Android官方文档,在使用MediaRecorder进行视频录制的时候一定要严格遵循上面的顺序,否则会报错在API里到处是“if it is called before setOutputFormat() or after prepare() ”因此一定要严格的按照顺序来进行摄像头操作
原创粉丝点击