【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);
    }

代碼片段引自拍攝SDK Vitamio Recorder 2.0:http://www.cnblogs.com/over140/p/3704580.html

 

結尾吐槽:

1、這個bug太2了!!

2、Instagram你是怎么發現的?! 

 

后續補充:

1、如果單獨設置不管用,請參考代碼部分的完整代碼設置。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM