Android MediaRecorder录制视频提示start failed的解决办法
2015-10-19 11:14
471 查看
今天测试MediaRecorder录制功能的时候出现一个蛋疼的BUG,按照官方提供的示例写好之后,start居然报错,打印日志一看说:start failed。
代码如下:
一般情况下呢,出现这个原因是由于系统不支持你所设置的分辨率码率这些参数,因此首先需要检查系统是否支持你所设置的参数,参数可以通过Camera的Parameter来进行判断,调用如下:
但是有时候即使设置了正确的参数仍旧会出现这个错误,这时候可能你就需要再start之前调用一下下面这个方法了:
代码如下:
mCamera = Camera.open(0); surfaceView = new SurfaceView(this); setContentView(surfaceView); mSurfaceHolder = surfaceView.getHolder(); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mRecorder = new MediaRecorder(); mRecorder.setCamera(mCamera); mRecorder.setAudioSource(AudioSource.DEFAULT); mRecorder.setVideoSource(VideoSource.DEFAULT); mRecorder.setOutputFormat(OutputFormat.MPEG_4); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); mRecorder.setVideoSize(320, 240); mRecorder.setVideoFrameRate(20); mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); File file = new File(Environment.getExternalStorageDirectory() .getAbsolutePath() + "/test.mp4"); if (file.exists()) { file.delete(); } try { file.createNewFile(); } catch (IOException e1) { e1.printStackTrace(); } mRecorder.setOutputFile(file.getAbsolutePath()); mSurfaceHolder.addCallback(new Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void surfaceCreated(SurfaceHolder holder) { try { mRecorder.prepare(); mRecorder.start(); } catch (Exception e) { Writer writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); e.printStackTrace(printWriter); Throwable cause = e.getCause(); while (cause != null) { cause.printStackTrace(printWriter); cause = cause.getCause(); } String str = writer.toString(); System.out.println(str); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } });
一般情况下呢,出现这个原因是由于系统不支持你所设置的分辨率码率这些参数,因此首先需要检查系统是否支持你所设置的参数,参数可以通过Camera的Parameter来进行判断,调用如下:
mCamera.getParameters().getSupportedVideoSizes()
但是有时候即使设置了正确的参数仍旧会出现这个错误,这时候可能你就需要再start之前调用一下下面这个方法了:
mCamera.unlock();这个方法从方法名来看 是解锁Camera 估计是怕使用设备冲突了把 ,具体原因以后有空再去看看Camera相关API说明。因此对于这种情况 我觉得最好的做法是在获取到Camera对象之后 进行一下如下操作:
mCamera.stopPreview(); mCamera.setPreviewCallback(null); mCamera.setPreviewCallbackWithBuffer(null); mCamera.release(); mCamera = null; mCamera = Camera.open(0); mCamera.lock(); mCamera.unlock();
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories