今天测试MediaRecorder录制功能的时候出现一个蛋疼的BUG,按照官方提供的示例写好之后,start居然报错,打印日志一看说:start failed。

代码如下:

        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();

更多相关文章

  1. 设备驱动-----Android关机流程总结
  2. Android动画分类汇总
  3. Android绘图系列(五)——绘制文本
  4. Android睡眠唤醒机制--系统架构
  5. Android(安卓)persistent属性研究
  6. phonegap+jquerymobile开发android的心得(2)
  7. Android(安卓)TextView 设置多种颜色
  8. Android学习笔记(十七)——使用意图调用内置应用程序
  9. Android(安卓)UI编程(2)——多级列表(ExpandableListView)

随机推荐

  1. 初学者怎么画出眼睛?板绘眼睛的步骤
  2. php语法技巧代码实例
  3. json,XHR,FetchAPI,async,await
  4. PHP方法的返回值示例详解
  5. nginx配置location方法总结
  6. 详解Nginx location 匹配规则
  7. 浅谈Spring 重定向指南
  8. ava中的关键字volatile详解
  9. PHP随机生成用户信息实例分析
  10. 带你从编码角度分析C++重载原理