转自 https://blog.csdn.net/w815878564/article/details/49247411
今天测试 MediaRecorder 录制功能的时候出现一个蛋疼的 BUG, 按照官方提供的示例写好之后, start 居然报错, 打印日志一看说: start failed.
代码如下:
- [java] view plain https://blog.csdn.net/w815878564/article/details/49247411# copy https://blog.csdn.net/w815878564/article/details/49247411#
- 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 来进行判断, 调用如下:
- [java] view plain https://blog.csdn.net/w815878564/article/details/49247411# copy https://blog.csdn.net/w815878564/article/details/49247411#
- mCamera.getParameters().getSupportedVideoSizes()
但是有时候即使设置了正确的参数仍旧会出现这个错误, 这时候可能你就需要再 start 之前调用一下下面这个方法了:
- [java] view plain https://blog.csdn.net/w815878564/article/details/49247411# copy https://blog.csdn.net/w815878564/article/details/49247411#
- mCamera.unlock();
这个方法从方法名来看 是解锁 Camera 估计是怕使用设备冲突了把 , 具体原因以后有空再去看看 Camera 相关 API 说明. 因此对于这种情况 我觉得最好的做法是在获取到 Camera 对象之后 进行一下如下操作:
- [java] view plain https://blog.csdn.net/w815878564/article/details/49247411# copy https://blog.csdn.net/w815878564/article/details/49247411#
- mCamera.stopPreview();
- mCamera.setPreviewCallback(null);
- mCamera.setPreviewCallbackWithBuffer(null);
- mCamera.release();
- mCamera = null;
- mCamera = Camera.open(0);
- mCamera.lock();
- mCamera.unlock();
来源: http://www.bubuko.com/infodetail-2601100.html