mCamera.unlock();
if (mMediaRecorder == null) {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setOrientationHint(90);
}
if (isCameraFrontFacing()) {
mMediaRecorder.setOrientationHint(270);
}
// Step 1: Unlock and set camera to MediaRecorder
mMediaRecorder.reset();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a Camera Parameters
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
/* Fixed video Size: 640 * 480*/
mMediaRecorder.setVideoSize(optimalPicSize.width, optimalPicSize.height);
/* Encoding bit rate: 1 * 1024 * 1024*/
mMediaRecorder.setVideoEncodingBitRate((int) ((1.5) * 1024 * 1024));
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setAudioSamplingRate(44); // 设置音频采样率为44
mMediaRecorder.setAudioEncodingBitRate(64); // 设置音频比特率为64
mMediaRecorder.setAudioChannels(1); // 设置录制的音频通道数
// Step 4: Set output file
mMediaRecorder.setOutputFile(savePath);
Step 1:
- setCamera参数能够使得在预览和录制中快速切换,避免Camera对象的重新加载。在某些Android手机自带的照相机程序中,切换预览与录制中的短暂卡顿,读者可自行体会。
- mMediaRecorder.setOrientationHint(90)在录制方向为竖直(portrait)时使用,它能使视频文件的沿顺时针方向旋转90度,如果不设置此项,播放视频时,画面会发生90度的旋转。不过这里更重要的是,即使设置了此项,在某些播放器上,画面依然会有90度的旋转(比如将在手机上正常播放的视频导入到PC中进行播放,或者嵌入H5的video标签中),这可是为什么呢?注意setOrientationHint的说明:Note that some video players may choose to ignore the compostion matrix in a video during playback. 那么如何做到在所有播放器上都能以正常方向播放呢?稍等,后续专门对其进行说明。
Step 2:
- setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION),VOICE_RECOGNITION相比于MIC会根据语音识别的需要做一些调谐,当然,这需要在系统支持的情况下。
- setVideoSource自然是VideoSource.CAMERA,只是在此两项设置必须在设置编码器之前设置,这无需说明。
Step 3:
- setOutputFormat需要在Step 2之后,并且在prepare()之前。这里采用OutputFormat.MPEG_4格式。
- setVideoSize需要权衡的因素较多,主要包括三方面:MediaRecorder支持的录制尺寸、视频文件的大小以及兼容不同Android机型。这里采用640 * 480(微信小视频的尺寸是320*240),文件大小在500-1000kb之间,并且市面上99%以上机型支持此录制尺寸。
- setVideoEncodingBitRate与视频的清晰度有关,设置此参数需要权衡清晰度与文件大小的关系。太高,文件大不易传输;太低,文件清晰度低,识别率低。需要根据实际业务场景灵活调整。
- setVideoEncoder采用H264编码,MPEG4、H263、H264等不同编码的差别比较可参考http://blog.csdn.net/wcl0715/article/details/676137,实际使用中,H264的压缩率较高,推荐使用。
- setAudioEncoder采用AudioEncoder.AAC,该设置主要是考虑其通用性、兼容性。
Step 4:
- setMaxFileSize指定录制文件的大小限制,当然还可以限制其最大录制时间。
- setOutputFile指定输出视频的路径。
- setOnErrorListener指定错误监听器。
总结 :
- 代码顺序很重要,不按顺序执行代码会抛异常
- setVideoEncodingBitRate 必须设置值,不设置值拍摄出来的视频非常模糊
参考文档 :
录制视频常见问题