2013-04-05 1189 views
26

我正在用MediaRecorder錄製視頻。我的代碼在2.3.3上正常工作,但在4.0.3上失敗。MediaRecorder.stop()停止失敗:-1007

的問題是以下幾點:代碼mediaRecorder.stop()拋出的RuntimeExeption

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

與logcat的消息

04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007 

UPDATE

我發現,MediaPlayer的一個報告錯誤(通過MediaPlayer.OnErrorListener)幾乎立即開始。錯誤代碼是100(媒體服務器死亡),額外-1007。

更新2 編寫代碼的MediaRecorder

  c = Camera.open(); 

    ... 

    // Step 1: Unlock and set camera to MediaRecorder 
    camera.unlock(); 
    mediaRecorder.setCamera(camera); 

    // Step 2: Set sources 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) 
    CamcorderProfile profile = CamcorderProfile 
      .get(CamcorderProfile.QUALITY_HIGH); 

    // manual set up! 

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 

    mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); 
    mediaRecorder.setVideoFrameRate(profile.videoFrameRate); 
    mediaRecorder.setVideoSize(profile.videoFrameWidth, 
      profile.videoFrameHeight); 

    mediaRecorder.setAudioChannels(profile.audioChannels); 
    mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate); 
    mediaRecorder.setAudioSamplingRate(profile.audioSampleRate); 

    mediaRecorder.setAudioEncoder(profile.audioCodec); 
    //mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
    mediaRecorder.setVideoEncoder(profile.videoCodec); 

    // mediaRecorder.setProfile(profile); 

    // Step 4: Set output file 
    mediaRecorder.setOutputFile("somefile.mp4"); 

    // Step 5: Set the preview output 
    mediaRecorder.setPreviewDisplay(preview.getHolder().getSurface()); 

    // Step 6: Prepare configured MediaRecorder 
    try { 
     mediaRecorder.prepare(); 
    } catch ... 
    { release mediaRecorder} 

然後我simplyCall mediaRecorder.start() 請注意,我需要的視頻被編碼成MP4格式。 此代碼適用於Samsng Galaxy GIO(android 2.3.3),並按照宏基E305(android 4.0.2)上的描述失敗

任何想法? 謝謝。

+0

我發現similiar問題,但它並沒有幫助:https://code.google.com/p/android/issues/detail?id=38107 – alekz 2013-04-05 12:21:33

+0

您能不能告訴代碼你如何準備MediaRecorder對象? – 2013-04-09 20:33:18

+0

某些代碼片段可能也有幫助 – 2013-04-10 00:01:26

回答

20

終於解決了。 問題是在設置相機的實際預覽之前設置預覽尺寸。預覽大小必須等於所選視頻大小。

CamcorderProfile profile = [get required profile]; 

Camera.Parameters parameters = mCamera.getParameters(); 
parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight); 
mCamera.setParameters(parameters); 

mCamera.setPreviewDisplay([surface holder]); 
mCamera.startPreview(); 

... 

//configure MediaRecorder and call MediaRecorder.start() 
+1

你的傳奇:)幫了我很多。我有一個正在進行的問題,這固定。在某些型號的手機上,我遇到了間歇性問題。特別是運行4.x.x的HTC Sensation無法在沒有首先設置預覽大小的情況下100%的時間錄製視頻,即使它只有1px寬。我遇到了奇怪的問題,它有時會記錄明亮的綠色條紋視頻,或者完全無法播放,但只有當分辨率爲720x480或更高時。通過使用'setPreviewSize()'奇怪的問題得到解決。 :) – wired00 2013-05-28 06:29:36

+0

謝謝它幫助了我!但是當我離開我的應用程序時,我得到了空指針異常。 '10 -11 22:38:47.609:E/SurfaceView(18569):更新窗口時出現NullPointerException。 mSession = [email protected],mWindow = [email protected] 10-11 22:38:47.609:E/SurfaceView(18569):意外的NullPointerException。'你能幫我解答一下嗎? – user2376920 2013-10-11 17:12:17

+0

我一段時間沒有任何問題使用此代碼,但由於我更新了我的Nexus 6到Android 6.0,該應用程序隨機崩潰: 'parameters.setPreviewSize' – 2015-10-05 19:55:12

14

引述MediaRecorder.java 「止損」 方法的文檔中的4.0.3:

停止錄製。在開始()後調用它。一旦停止記錄, 您將不得不再次配置它,就好像它剛剛構建了 一樣。請注意,如果 stop()被調用時沒有收到有效的音頻/視頻數據,則應用程序會故意將RuntimeException拋出到 應用程序。如果在 start()後立即調用stop(),則會發生這種情況。由於 輸出文件在發生這種情況時沒有正確構建,故障使應用程序可以相應地採取措施清理輸出文件(例如,刪除輸出文件) 。

而MediaPlayer報告這個「媒體服務器死亡」這一事實也是出於同樣的原因。你可以發佈你的代碼的其餘部分,看看是否有任何可能導致這個問題的誤解?

+0

感謝您的回答。我已經知道拋出異常的原因。但我仍然無法得到,爲什麼MediaRecorder的配置不適用於acerE350(Android 4.0.3)以及錯誤「-1007」是什麼意思。至於你的問題 - 我可以發佈我的代碼的其餘部分,但它在其他幾個手機上運行穩健...我檢查了所有方法都按正確順序調用,並且可以對MEdiaRecorders進行重新配置ServerDied錯誤,但我只想配置MediaRenderer以最高質量創建MP4視頻。 – alekz 2013-04-13 18:24:50

+1

您是否有任何機會(即使很小),您開始和停止記錄器太快?你想錄制多少幀(或幾秒)? – 2013-04-13 19:10:23

+0

我不這麼認爲。它適用於多款預算手機。代碼非常標準。至於fps - 我已經嘗試了30(QUALITY_HIGH配置文件)和15.都失敗了。 – alekz 2013-04-15 05:59:59

0

所以,我發現被報告爲我在Android模擬器API 18這個錯誤(後記錄被更高版本上工作正常)。

我發現那是什麼,如果我已經初始化並啓動開始我MediaRecorder實例之前稱爲Camera.startPreview(),我會打電話MediaRecorder.stop時,你得到stop failed: -1007日誌,但如果我初始化我MediaRecorder視頻前叫Camera.stopPreview()將記錄的罰款。

我希望這有助於

+0

https:// stackoverflow。com/questions/47996933/mediarecorder-keeping-freezing-recording-recording-can-get-to-work。這是我的代碼,我有這個問題,所以我哪裏錯了? – iBEK 2017-12-28 02:29:36

相關問題