Подтвердить что ты не робот

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

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

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

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

выполняется запись и воспроизведение.

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

mFile = getFilesDir().getAbsolutePath();

OR

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

4b9b3361

Ответ 1

Благодаря gtkandroid:

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

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

Ответ 2

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

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

В документации по методу отмечено:

android.media.MediaPlayer.setDataSource(FileDescriptor fd)

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