mediaRecorder = new MediaRecorder();
try {
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
//输出格式
mediaRecorder.setOutputFormat(camcorderProfile.fileFormat);
//视频帧率
mediaRecorder.setVideoFrameRate(camcorderProfile.videoFrameRate);
//视频大小
mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
//视频比特率
mediaRecorder.setVideoEncodingBitRate(camcorderProfile.videoBitRate);
//视频编码器
mediaRecorder.setVideoEncoder(camcorderProfile.videoCodec);
//音频编码率
mediaRecorder.setAudioEncodingBitRate(camcorderProfile.audioBitRate);
//音频声道
mediaRecorder.setAudioChannels(camcorderProfile.audioChannels);
//音频采样率
mediaRecorder.setAudioSamplingRate(camcorderProfile.audioSampleRate);
//音频编码器
mediaRecorder.setAudioEncoder(camcorderProfile.audioCodec);
File outputFile = outputPath;
String outputFilePath = outputFile.toString();
//输出路径
mediaRecorder.setOutputFile(outputFilePath);
//设置视频输出的最大尺寸
if (mCameraConfigProvider.getVideoFileSize() > 0) {
mediaRecorder.setMaxFileSize(mCameraConfigProvider.getVideoFileSize());
mediaRecorder.setOnInfoListener(this);
}
//设置视频输出的最大时长
if (mCameraConfigProvider.getVideoDuration() > 0) {
mediaRecorder.setMaxDuration(mCameraConfigProvider.getVideoDuration());
mediaRecorder.setOnInfoListener(this);
}
mediaRecorder.setOrientationHint(getVideoOrientation(mCameraConfigProvider.getSensorPosition()));
//准备
mediaRecorder.prepare();
return true;
} catch (IllegalStateException error) {
Log.e(TAG, "IllegalStateException preparing MediaRecorder: " + error.getMessage());
} catch (IOException error) {
Log.e(TAG, "IOException preparing MediaRecorder: " + error.getMessage());
} catch (Throwable error) {
Log.e(TAG, "Error during preparing MediaRecorder: " + error.getMessage());
}
releasemediaRecorder();
return false;
}
值得一提的是,日常的业务中经常对拍摄视频的时长或者大小有要求,这个可以通过mediaRecorder.setOnInfoListener()来处理,OnInfoListener会监听正在录制的视频,然后我们 可以在它的回调方法里处理。
@Override
public void onInfo(MediaRecorder mediaRecorder, int what, int extra) {
if (MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED == what) {
//到达最大时长
} else if (MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED == what) {
//到达最大尺寸
}
}
更多关于MediaRecorder的介绍可以参考[MediaRecorder官方文档](
)。
### 1.7 结束视频录制
结束视频录制也很简单,只需要调用mediaRecorder.stop()方法即可。
mediaRecorder.stop();
此外,如果不再使用相机,也要注意释放相机资源。
以上便是Camera的全部内容,还是比较简单的,下面我们接着来讲Camera2的相关内容,注意体会两者的区别。
二 Camera2实践指南
-------------
* [Android Camera2 官方视频](
)
* [Android Camera2 官方文档](
)
* [Android Camera2 官方用例](
)
Camera2 API中主要涉及以下几个关键类:
* CameraManager:摄像头管理器,用于打开和关闭系统摄像头
* CameraCharacteristics:描述摄像头的各种特性,我们可以通过CameraManager的getCameraCharacteristics(@NonNull String cameraId)方法来获取。
* CameraDevice:描述系统摄像头,类似于早期的Camera。
* CameraCaptureSession:Session类,当需要拍照、预览等功能时,需要先创建该类的实例,然后通过该实例里的方法进行控制(例如:拍照 capture())。
* CaptureRequest:描述了一次操作请求,拍照、预览等操作都需要先传入CaptureRequest参数,具体的参数控制也是通过CameraRequest的成员变量来设置。
* CaptureResult:描述拍照完成后的结果。
Camera2拍照流程如下所示:
![](https://user-gold-cdn.xitu.io/2017/12/15/16059bc5a0fee2d1?imageView2/0/w/1280/h/960/ignore-error/1)
开发者通过创建CaptureRequest向摄像头发起Capture请求,