软件编程
位置:首页>> 软件编程>> Android编程>> 解决Android MediaRecorder录制视频过短问题

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

作者:lqh  发布时间:2023-04-24 01:47:56 

标签:Android,MediaRecorder

具体表现:

  调用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);
 }
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com