首页 > 系统 > Android > 正文

解决Android MediaRecorder录制视频过短问题

2019-12-12 05:55:49
字体:
来源:转载
供稿:网友

具体表现:

  调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩。

 错误信息:

java.lang.RuntimeException: stop failed.  at android.media.MediaRecorder.stop(Native Method)

 解决办法:

  在stop以前调用setOnErrorListener(null);就行了!

 相关代码:

 /** 开始录制 */  @Override  public MediaPart startRecord() {    if (mMediaObject != null && mSurfaceHolder != null && !mRecording) {      MediaPart result = mMediaObject.buildMediaPart(mCameraId, ".mp4");      try {        if (mMediaRecorder == null) {          mMediaRecorder = new MediaRecorder();          mMediaRecorder.setOnErrorListener(this);        } else {          mMediaRecorder.reset();        }        // Step 1: Unlock and set camera to MediaRecorder        camera.unlock();        mMediaRecorder.setCamera(camera);        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());        // Step 2: Set sources        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//before setOutputFormat()        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//before setOutputFormat()        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);        //设置视频输出的格式和编码        CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);        //        mMediaRecorder.setProfile(mProfile);        mMediaRecorder.setVideoSize(640, 480);//after setVideoSource(),after setOutFormat()        mMediaRecorder.setAudioEncodingBitRate(44100);        if (mProfile.videoBitRate > 2 * 1024 * 1024)          mMediaRecorder.setVideoEncodingBitRate(2 * 1024 * 1024);        else          mMediaRecorder.setVideoEncodingBitRate(mProfile.videoBitRate);        mMediaRecorder.setVideoFrameRate(mProfile.videoFrameRate);//after setVideoSource(),after setOutFormat()        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//after setOutputFormat()        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//after setOutputFormat()        //mMediaRecorder.setVideoEncodingBitRate(800);        // Step 4: Set output file        mMediaRecorder.setOutputFile(result.mediaPath);        // Step 5: Set the preview output        //        mMediaRecorder.setOrientationHint(90);//加了HTC的手机会有问题        Log.e("Yixia", "OutputFile:" + result.mediaPath);        mMediaRecorder.prepare();        mMediaRecorder.start();        mRecording = true;        return result;      } catch (IllegalStateException e) {        e.printStackTrace();        Log.e("Yixia", "startRecord", e);      } catch (IOException e) {        e.printStackTrace();        Log.e("Yixia", "startRecord", e);      } catch (Exception e) {        e.printStackTrace();        Log.e("Yixia", "startRecord", e);      }    }    return null;  }  /** 停止录制 */  @Override  public void stopRecord() {    long endTime = System.currentTimeMillis();    if (mMediaRecorder != null) {      //设置后不会崩      mMediaRecorder.setOnErrorListener(null);      mMediaRecorder.setPreviewDisplay(null);      try {        mMediaRecorder.stop();      } catch (IllegalStateException e) {        Log.w("Yixia", "stopRecord", e);      } catch (RuntimeException e) {        Log.w("Yixia", "stopRecord", e);      } catch (Exception e) {        Log.w("Yixia", "stopRecord", e);      }    }    if (camera != null) {      try {        camera.lock();      } catch (RuntimeException e) {        Log.e("Yixia", "stopRecord", e);      }    }    mRecording = false;  }  /** 释放资源 */  @Override  public void release() {    super.release();    if (mMediaRecorder != null) {      mMediaRecorder.setOnErrorListener(null);      try {        mMediaRecorder.release();      } catch (IllegalStateException e) {        Log.w("Yixia", "stopRecord", e);      } catch (Exception e) {        Log.w("Yixia", "stopRecord", e);      }    }    mMediaRecorder = null;  }  @Override  public void onError(MediaRecorder mr, int what, int extra) {    try {      if (mr != null)        mr.reset();    } catch (IllegalStateException e) {      Log.w("Yixia", "stopRecord", e);    } catch (Exception e) {      Log.w("Yixia", "stopRecord", e);    }    if (mOnErrorListener != null)      mOnErrorListener.onVideoError(what, extra);  }

以上就是对Android MediaRecorder 资料整理,后续继续补充,有需要的朋友可以参考下。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表