今天在写使用mediarecorder进行录像时,遇到了花屏的问题,在魅族上面一切正常,但是在小米上面,就会出现花屏的现象。针对这个问题,我也在网上,好好搜了一把,在这里我主要是参考了:http://blog.csdn.net/top_along/article/details/16368379的文章,你们也可以看看。
这是一段初始化相机的代码:
private void initCamera() throws IOException {
if (mCamera != null) {
freeCameraResource();
}
try {
mCamera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
freeCameraResource();
}
if (mCamera == null)
return;
// setCameraParams();
parameters = mCamera.getParameters();
parameters.setJpegThumbnailQuality(100);// 设置质量
// parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);//闪光灯
parameters
.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
mCamera.setParameters(parameters);
//将捕获的画面旋转多少度显示:由于摄像头默认捕获的画面byte[]是根据横向来的,而应用是竖向的,所以需要旋转90度
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(mSurfaceHolder);
//注:避免花屏第一步:开启预览,就不用解锁摄像头啦
//开启预览
mCamera.startPreview();
// mCamera.unlock();//解锁摄像头
mCamera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
}
这是一段初始化MediaRecord的代码:
private void initRecord() throws IOException {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.reset();
// 取消摄像头预览,解锁并将摄像头指向MediaRecorder
if (mCamera != null) {
//注:避免花屏第二步:真正拍摄时,解锁摄像头时,关闭预览
mCamera.stopPreview();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
}
mMediaRecorder.setOnErrorListener(this);
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
// 指定源
mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 视频源
mMediaRecorder.setAudioSource(AudioSource.MIC);// 音频源
mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 视频输出格式
mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);// 视频录制格式
mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);// 音频格式
mMediaRecorder.setVideoSize(mWidth, mHeight);// 设置分辨率:
mMediaRecorder.setVideoFrameRate(16);// // 视频帧频率
mMediaRecorder.setVideoEncodingBitRate(1 * 1280 * 720);// 设置帧频率,然后就清晰了
mMediaRecorder.setOrientationHint(90);// 输出旋转90度,保持竖屏录制
// mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000);
// mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
mMediaRecorder.setOutputFile(mRecordFile.getAbsolutePath());//指定输出文件
mMediaRecorder.prepare();
try {
mMediaRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
其实自制摄像机的核心代码也就这么多,其实花屏的解决方案:在预览的时候,开启预览,不解锁相机,在拍摄的时候,关闭预览,解锁相机。