Android调用系统摄像头--使用MediaRecorder--2--使用MediaRecorder进行录制
16lz
2021-01-24
准备好了预览(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() ”因此一定要严格的按照顺序来进行摄像头操作
更多相关文章
- Android实现拍照、录像、录音代码范例
- android 随手记 videoview循环播放网络视频 和mediaplayer+sufac
- Android(安卓)选择图片、上传图片之PictureSelector
- Android视频方向为什么出现问题以及Android视频应用开发中的处理
- android和PC(Python)通过USB(adb模式)基于Socket传输图像(视频)
- Android(java方法)上实现mp4的分割和拼接 (二)
- Android摄像头开发完美demo---(循环聚焦,缩放大小,旋转picture,
- Android的NoVIP视频解析APP开发完整过程
- android 解码出来的视频frame数据,是如何一步步的传递到显示端的(