最近在做一个项目需要运用到MediaRecorder的API,之前都没接触过这部分,开始着手弄的时候各种各样的问题,真是让人崩溃呀!

最后通过网上的资料和大神的指点,当然也有自己几天坚持不懈的努力,终于搞定了!

录像之前我采用Camera进行预览Camera.startPreview();预览的时候不知道为什么非常模糊,完全看不清,后来给Camera设置一些参数就清晰了,代码如下:

 mParams = mCamera.getParameters();
mParams.setPictureFormat(ImageFormat.JPEG);//设置拍照后存储的图片格式
mParams.setJpegQuality(100);//设置图片的质量
mParams.setJpegThumbnailQuality(100);//设置缩略图的质量
//设置PreviewSize和PictureSize
Size pictureSize = CamParaUtil.getInstance().getPropPictureSize(mParams.getSupportedPictureSizes());
mParams.setPictureSize(pictureSize.width, pictureSize.height);
Size previewSize = CamParaUtil.getInstance().getPropPreviewSize(
mParams.getSupportedPreviewSizes(), previewRate, minWidth);
mParams.setPreviewSize(previewSize.width, previewSize.height);//设置预览SIze就清晰了
mCamera.setDisplayOrientation(90); private Size getPropPreviewSize(List<Camera.Size> list, float th, int minWidth){ int i = 0;
for(Size s:list){
if((s.width >= minWidth) && equalRate(s, th)){
Log.i(TAG, "PreviewSize:w = " + s.width + "h = " + s.height);
break;
}
i++;
}
if(i == list.size()){
i = 0;//如果没找到,就选最小的size
}
return list.get(i);
} private Size getPropPictureSize(List<Camera.Size> list){
Size cameraSize = null;
if (list.size()>0) {
cameraSize=list.get(0);
for (Size size : list) {
//小于100W像素
if (size.width*size.height<100*10000) {
cameraSize=size;
break;
}
}
} return cameraSize;
} private boolean equalRate(Size s, float rate){
float r = (float)(s.width)/(float)(s.height);
if(Math.abs(r - rate) <= 0.03)
{
return true;
}
else{
return false;
}
}

解决了清晰度,接下来就要开始录像啦,录像时候要出现清晰度的问题,解决方法设置画面质量mediarecorder.setProfile,用这个方式的时候要注意版本兼容,除了兼容问题还有一个就是设置了这个setProfile,就不能设置输出格式和编码格式,代码如下:

 if(mediarecorder == null)
mediarecorder = new MediaRecorder();// 创建mediarecorder对象
else
mediarecorder.reset();
mCamera.stopPreview(); //这行代码是为了解决设置预览Size太大,开始录像画面定住的问题
mCamera.unlock();
mediarecorder.setCamera(mCamera);
// 设置录制视频源为Camera(相机)
mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //录音源为麦克风
//设置输出视频朝向,便于播放器识别。由于是竖屏录制,需要正转90°
mediarecorder.setOrientationHint(90);
boolean boo = false;
try {
// Set the recording profile.
CamcorderProfile profile = null;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P))
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P))
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P);
else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_480P))
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH))
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
if (profile != null){
mediarecorder.setProfile(profile);
boo = true;
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
if(!boo){
//设置了setProfile的话,下面的输出格式和编码需要注释
// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
mediarecorder
.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 设置录制的视频编码h264
mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//音频编码
mediarecorder.setVideoEncodingBitRate(5*1024*1024);
mediarecorder.setVideoFrameRate(15);
}
mediarecorder.setPreviewDisplay(holder.getSurface());
mediarecorder.setMaxDuration(15 * 1000); mediarecorder.setOutputFile(videoFile.getPath());
try {
// 准备录制
mediarecorder.prepare();
// 开始录制
mediarecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

最新文章

  1. delphi 取硬盘号
  2. JNI中C调用Java方法
  3. jQuery单选框radio绑定click事件
  4. IBatis.Net系列-多参数的SQL语句的配置
  5. (圆形imageview 类似qq头像)---》(ps:引用第三库APAvatarImageView&gt;
  6. ViewGroup源码部分解析
  7. Json字符与Json对象的相互转换
  8. MVC小系列(十八)【给checkbox和radiobutton添加集合的重载】
  9. xcode本地运行H5游戏可以吗?
  10. My way on Linux - [虚拟化&amp;云计算] - 云计算概述&amp;KVM虚拟化基础
  11. hadoop笔记之Hive的数据存储(内部表)
  12. python类:magic魔术方法
  13. iOS逆向开发(3):锁定APP的目标类与函数 | reveal | lldb | debugserver | 远程调试
  14. Ubuntu 无法进行SSH连接,开启22端口
  15. Linux 与 Unix 到底有什么不同?区别在哪?
  16. 【Linux】CentOs的常用命令
  17. 别人的Linux私房菜(4)安装CentOS7
  18. 【CF526F】Pudding Monsters cdq分治
  19. [转]xml解析工具的效率比较QDomDocument、TinyXml-2、RapidXml、PugiXml
  20. 『OpenCV3』Mat简介

热门文章

  1. 皮肤和DLL和图片等项目文件完全整合到exe中
  2. controller返回js中文变成?解决方案
  3. [转]理解$watch ,$apply 和 $digest --- 理解数据绑定过程
  4. Excel分类汇总
  5. 用反射封装HttpHandler,实现通过action方法名调用方法
  6. 山区建小学(区间DP)
  7. 【转】linux平台Redis安装部署
  8. python中的 &#39; &#39; 和 &quot; &quot;
  9. C#windows窗体应用程序如何自适应大小
  10. 有关less 处理@arguments的一些高级技巧