之前讲了camera的相关问题,今天把mediaRecorder总结一下
1.视频的videoSize设置
视频的录制尺寸设置考虑的方面比较多,说下我在这里碰到的一些坑。初次以camera的预览尺寸作为videoSize的,经过测试发现,部分手机(酷派)录制时直接崩溃了,原因是得到的bestPreviewSize不匹配该手机支持的videoSize。后来找到这个方法:getSupportVideoSize,从这个list中获取一个与预览尺寸同比例的宽高。这样崩溃的问题解决了。这里设置的videoSize比较大,拍摄的视频清晰度也比较好。这里还有个问题,nexus上预览尺寸与videoSize尺寸值不一致,设置后录制的视频,其他手机无法播放。思考了一番,在支持的videoSize中尽量选取与预览尺寸一致的,这样兼容会好很多。但是视频文件就比较大了。我用华为p7的手机,测试得到,6s视频在2m左右。我们的视频是要上传到服务端的,这个视频大小上就不符合要求了。最后参考google官方的例子,设定了640*480。视频清晰度有所下降,但在手机上基本不影响播放的。
//Step 1: Unlock and set camera to MediaRecorder
camera.unlock();
recorder.setCamera(camera);
recorder.setPreviewDisplay(mSurfaceHolder.getSurface());
// Step 2: Set sources
//设置采集声音
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
//设置采集图像
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//设置视频,音频的输出格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//设置视频输出的格式和编码
CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
recorder.setVideoSize(640, 480);
//音频一秒钟包含多少数据位
recorder.setAudioEncodingBitRate(128);
if (mProfile.videoBitRate > 2 * 1024 * 1024) {
recorder.setVideoEncodingBitRate(2 * 1024 * 1024);
} else {
recorder.setVideoEncodingBitRate(mProfile.videoBitRate);
}
recorder.setVideoFrameRate(mProfile.videoFrameRate);
//设置音频的编码格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
//设置图像的编码格式
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setOrientationHint(resultDegrees);
//设置记录会话的最大持续时间ms
recorder.setMaxDuration(6000);
//Step 4: Set output file
String videoPath = Constant.TALK_VIDEO_PATH + getDate() + ".mp4";
recorder.setOutputFile(videoPath);
2.MedaiaRecorder录制过短崩溃
这里主要是设置一个onErrorListener,处理该异常。
start的时候: recorder.setOnErrorListener(this); stop的时候,recorder.setOnErrorListener(null);
@Override
public void onError(MediaRecorder mr, int what, int extra) {
try {
if (mr != null) {
mr.reset();
}
} catch (Exception e) {
e.printStackTrace();
}
}
3.关于MediaRecorder录制状态改变时发出的声音,查找了不少资料,一直没有找到解决方案,设置禁音大部分手机是无效的。后来看到Vcamera的代码,原来人家就没用系统的mediaRecorder,直接写成文件块,用ffmpeg合成。这里录制的时候,用的宽高比3:4,录制的视频再用ffmpeg处理成半屏大小。这也解释了微信为啥能半屏录制小视频了。