准备好了预览(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() ”因此一定要严格的按照顺序来进行摄像头操作


更多相关文章

  1. Android实现拍照、录像、录音代码范例
  2. android 随手记 videoview循环播放网络视频 和mediaplayer+sufac
  3. Android(安卓)选择图片、上传图片之PictureSelector
  4. Android视频方向为什么出现问题以及Android视频应用开发中的处理
  5. android和PC(Python)通过USB(adb模式)基于Socket传输图像(视频)
  6. Android(java方法)上实现mp4的分割和拼接 (二)
  7. Android摄像头开发完美demo---(循环聚焦,缩放大小,旋转picture,
  8. Android的NoVIP视频解析APP开发完整过程
  9. android 解码出来的视频frame数据,是如何一步步的传递到显示端的(

随机推荐

  1. Android调用 Webservice报org.ksoap2.ser
  2. NDK With Android Studio
  3. 用RelativeLayout布局可以在imageview中
  4. Android获取SDK的版本信息
  5. Background Service in Android Using In
  6. Android版本号 API level一览表
  7. android之PopupWindow
  8. Android GLSurfaceView模糊效果
  9. Android 获取手机信号
  10. android ViewFlipper实现图片轮播