2011-06-17 83 views
23

我正在使用Audio Capture sample on android.com在實際設備上錄製和播放音頻。 (摩托羅拉觸摸板和三星Galaxy S)。在內部存儲器上播放文件時MediaPlayer錯誤-2147483648

當我定義爲

mFile = Environment.getExternalStorageDirectory().getAbsolutePath(); 

錄製和播放作品的音頻文件的路徑。

但如果我設置的音頻文件作爲

mFile = getFilesDir().getAbsolutePath(); 

OR

mFile = getDir("media", Context.MODE_PRIVATE).getAbsolutePath(); 

OR

mFile = getDir("media", Context.MODE_WORLD_READABLE).getAbsolutePath(); 

記錄似乎工作,但回放失敗

ERROR/MediaPlayer的(4559):錯誤(1,-2147483648)

什麼函數將返回正確的內部存儲目錄只在我的應用程序保存播放音頻文件?

有問題的代碼在我的onCreate函數中。 (在這個例子中,他們有它的構造函數,但我把它移到的onCreate否則getFilesDir()和GETDIR()沒有上下文中工作。)

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

// mFile = Environment.getExternalStorageDirectory().getAbsolutePath();  // OK 
// mFile = getFilesDir().getAbsolutePath();         // BAD 
// mFile = getDir("media", Context.MODE_PRIVATE).getAbsolutePath();   // BAD 
    mFile = getDir("media", Context.MODE_WORLD_READABLE).getAbsolutePath(); // BAD 
    mFile += "/audiorecordtest.3gp"; 
    Log.e(LOG_TAG,mFile); 
// ... 
} 

當我記錄到外部存儲(和回放正常工作),日誌是這樣的:

06-17 10:07:30.890: DEBUG/AudioHardwareTegra(85): getInputBufferSize: returns 320 for rate 8000 
06-17 10:07:30.900: INFO/MPEG4Writer(85): limits: 2147483647/0 bytes/us, bit rate: 12200 bps and the estimated moov size 3072 bytes 
06-17 10:07:30.960: DEBUG/AudioHardwareTegra(85): setDriver_l: Analog mic? yes. Bluetooth? no. 
06-17 10:07:31.100: WARN/AudioFlinger(85): RecordThread: buffer overflow 
06-17 10:07:31.100: INFO/MPEG4Writer(85): setStartTimestampUs: 86380 
06-17 10:07:31.100: INFO/MPEG4Writer(85): Earliest track starting time: 86380 
06-17 10:07:34.350: DEBUG/MPEG4Writer(85): Stopping Audio track 
06-17 10:07:34.450: INFO/MPEG4Writer(85): Received total/0-length (167/0) buffers and encoded 167 frames. - audio 
06-17 10:07:34.450: INFO/MPEG4Writer(85): Audio track drift time: -20309 us 
06-17 10:07:34.450: DEBUG/MPEG4Writer(85): Stopping Audio track source 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Audio track stopped 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Stopping writer thread 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): 0 chunks are written in the last batch 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Writer thread stopped 
06-17 10:07:34.470: DEBUG/MPEG4Writer(85): Stopping Audio track 
06-17 10:07:34.470: WARN/MediaRecorder(4472): mediarecorder went away with unhandled events 
06-17 10:07:40.310: INFO/StagefrightPlayer(85): setDataSource('/mnt/sdcard/audiorecordtest.3gp') 
06-17 10:07:46.590: DEBUG/AudioHardwareTegra(85): AudioStreamOutTegra::flush() 
06-17 10:07:46.670: DEBUG/AudioHardwareTegra(85): AudioStreamOutTegra::flush() returns 

當我記錄到內部存儲器(和失敗),日誌是這樣的:

06-17 10:08:28.380: DEBUG/AudioHardwareTegra(85): getInputBufferSize: returns 320 for rate 8000 
06-17 10:08:28.380: INFO/MPEG4Writer(85): limits: 2147483647/0 bytes/us, bit rate: 12200 bps and the estimated moov size 3072 bytes 
06-17 10:08:28.440: DEBUG/AudioHardwareTegra(85): setDriver_l: Analog mic? yes. Bluetooth? no. 
06-17 10:08:28.970: WARN/AudioFlinger(85): RecordThread: buffer overflow 
06-17 10:08:28.970: INFO/MPEG4Writer(85): setStartTimestampUs: 83095 
06-17 10:08:28.970: INFO/MPEG4Writer(85): Earliest track starting time: 83095 
06-17 10:08:34.020: DEBUG/MPEG4Writer(85): Stopping Audio track 
06-17 10:08:34.080: WARN/AudioFlinger(85): RecordThread: buffer overflow 
06-17 10:08:34.090: INFO/MPEG4Writer(85): Received total/0-length (257/0) buffers and encoded 257 frames. - audio 
06-17 10:08:34.090: INFO/MPEG4Writer(85): Audio track drift time: -385311 us 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping Audio track source 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Audio track stopped 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping writer thread 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): 0 chunks are written in the last batch 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Writer thread stopped 
06-17 10:08:34.090: DEBUG/MPEG4Writer(85): Stopping Audio track 
06-17 10:08:34.100: WARN/MediaRecorder(4559): mediarecorder went away with unhandled events 
06-17 10:08:40.740: INFO/StagefrightPlayer(85): setDataSource('/data/data/my.record.test/files/audiorecordtest.3gp') 
06-17 10:08:40.740: ERROR/MediaPlayer(4559): error (1, -2147483648) 
06-17 10:08:40.740: ERROR/AudioRecordTest(4559): prepare() failed 

日誌看升的記錄部分對我來說也是如此,所以我認爲它是錄音,但我不知道如何以任何方式檢查文件,除了播放它。 ;-)

當我使用getDir()時,錯誤日誌類似。

回答

23

Thanks to gtkandroid

相反mPlayer.setDataSource(mFile);我這樣做:

FileInputStream fileInputStream = new FileInputStream(mFile); 
mPlayer.setDataSource(fileInputStream.getFD());   
fileInputStream.close(); 
mPlayer.prepare(); 
+0

感謝球員的.close()建議;我只是將它添加到我的答案中。 – 2013-09-30 10:42:56

3

Tim Crowley是正確的。更好的做法是關閉流,是這樣的:

FileInputStream stream = new FileInputStream(path); 
mediaPlayer.setDataSource(stream.getFD()); 
stream.close(); 

據該方法的文檔中指出:

android.media.MediaPlayer.setDataSource(FileDescriptor fd)

設置數據源(FileDescriptor)來使用。它是來電者的 責任到關閉文件描述符。 作爲 這樣做很安全,因爲此呼叫返回

相關問題