2015-10-22 56 views
2

我需要記錄和播放音頻文件,我使用的代碼,這兩個一塊塊:setDataSourceFD失敗:狀態= 0x80000000的玩上三星手機上的AAC文件:

對於記錄:

private void initRecorder() { 
    try { 
     mRecorder = new MediaRecorder(); 
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS); 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
     mRecorder.setOutputFile(RECORD_FILE_NAME); 
     mRecorder.prepare(); 
     mRecorder.start(); 
    } catch (IllegalStateException | IOException e) { 
     Utility.e("initRecorder: " + e.getMessage()); 
    } 
} 

播放:

try { 
     FileDescriptor fd = null; 
     FileInputStream fis = new FileInputStream(RECORD_FILE_NAME); 
     fd = fis.getFD(); 

     if (fd != null) { 
      mMediaPlayer = new MediaPlayer(); 
      mMediaPlayer.setDataSource(fd); 
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mMediaPlayer.prepare(); 

      mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) { 
        if (mPlayTime > 0) { 
         mMediaPlayer.seekTo(mPlayTime); 
        } 
        mMediaPlayer.start(); 
        setStatus(STATUS_PLAYING); 
       } 
      }); 

      mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mp) { 
        mMediaPlayer.release(); 
        RecordMomentActivity.this.mPlayTime = 0; 
        setStatus(STATUS_NOT_PLAYING); 
       } 
      }); 
     } 
    } catch (Exception e) { 
     Utility.e("Exception: " + e.getMessage()); 
     setStatus(STATUS_NOT_PLAYING); 
    } 
} 

而這種代碼的偉大工程,記錄和重放在Nexus 5(A音頻ndroid 6.0)和Android 5.0的LG G3。但是當我使用的三星手機,我得到異常:

setDataSourceFD失敗:狀態= 0x80000000的

有人遇到這個問題?並知道我應該如何處理它? 如果沒有,我可以用來錄製和播放音頻文件嗎?

在此先感謝。

回答

2

如果文件損壞或處理的MediaPlayer服務無法正確處理,就會發生這種情況。

看一些例子:

MediaPlayer.setDataSource causes IOException for valid file

Exception when calling setDataSource(FileDescriptor) method (failed.: status=0x80000000)

而且,可以是文件沒有正確地記錄後關閉,玩家失敗。

+0

就像我提到的問題,同樣的功能在Nexus 5的工作與Android 6.0。所以這不是一個損壞的文件的情況。但是,三星設備的一些問題。 –

+0

以及採取此文件並在其他設備上播放它。 –

+0

考慮到一些設備在使用API​​時比其他設備對於小錯誤更具有「彈性」,並且這對於媒體API是非常正確的。這是我的觀點。 MediaPlayer服務很容易因爲這種事情而失敗。記錄完成後,打開媒體播放器之前是否停止並釋放媒體記錄器?你能分享這些代碼嗎? –

1

嘗試使用MPEG4 OUTPUTFORMAT

private void initRecorder() { 
    try { 
     mRecorder = new MediaRecorder(); 
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
     mRecorder.setOutputFile(RECORD_FILE_NAME); 
     mRecorder.prepare(); 
     mRecorder.start(); 
    } catch (IllegalStateException | IOException e) { 
     Utility.e("initRecorder: " + e.getMessage()); 
    } 
} 
相關問題