Ошибка MediaPlayer -2147483648 при воспроизведении файла на внутренней памяти

Я использую образец Audio Capture на android.com для записи и воспроизведения аудио на реальных устройствах. (Сенсорная панель Motorola и Samsung Galaxy S).

Когда я определяю путь аудиофайла как

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

Записи и воспроизведения.

Но если я установил аудиофайл как

 mFile = getFilesDir().getAbsolutePath(); 

ИЛИ

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

ИЛИ

 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 ().

Solutions Collecting From Web of "Ошибка MediaPlayer -2147483648 при воспроизведении файла на внутренней памяти"

Благодаря gtkandroid :

Вместо mPlayer.setDataSource(mFile); Я сделал это:

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

Тим Кроули прав. Лучшая практика заключается в том, чтобы закрыть поток, например:

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

В документации по методу указывается:

android.media.MediaPlayer.setDataSource(FileDescriptor fd)

Устанавливает источник данных ( FileDescriptor ) для использования. Завершение дескриптора файла является обязанностью вызывающего абонента. Это безопасно сделать, как только этот вызов вернется .