MediaRecorder录像那些事
2015-10-27 17:47
330 查看
最近在做一个项目需要运用到MediaRecorder的API,之前都没接触过这部分,开始着手弄的时候各种各样的问题,真是让人崩溃呀!
最后通过网上的资料和大神的指点,当然也有自己几天坚持不懈的努力,终于搞定了!
录像之前我采用Camera进行预览Camera.startPreview();预览的时候不知道为什么非常模糊,完全看不清,后来给Camera设置一些参数就清晰了,代码如下:
解决了清晰度,接下来就要开始录像啦,录像时候要出现清晰度的问题,解决方法设置画面质量mediarecorder.setProfile,用这个方式的时候要注意版本兼容,除了兼容问题还有一个就是设置了这个setProfile,就不能设置输出格式和编码格式,代码如下:
最后通过网上的资料和大神的指点,当然也有自己几天坚持不懈的努力,终于搞定了!
录像之前我采用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(); }
相关文章推荐
- system 函数
- 运用冒泡排序法-从小到大排列数组中的元素
- iOS tableView 自带的下拉刷新
- 信息安全系统设计基础第七周学习总结
- mysql中select中in()查询语句 原样输出
- C可变参数函数实现
- 合并两有序数组 时间O(n) 无辅助空间
- git reset小结
- python 装饰器
- Unity3D中的socket通信之九(账号密码/数据传输过程中的加密解密)
- 反射机制----Class
- Android开发,仿苹果的弹出窗口界面、以及窗口动画效果、窗口圆角实现。
- Sql查询的坑
- Web服务器集群搭建
- Undefined symbols for architecture i386: "_OBJC_CLASS_$_AVOSCloud", referenced from:
- C#学习(6):DataSet构建EasyUI树结构
- startssl,免费的ssl证书申请及注意事项
- JAVA的Random类(转)--几率的实现
- vs2010 小Tip
- Oralce定时执行procedure