Intereting Posts
Мягкая клавиатура скрывает панель действий Сделайте снимок экрана целиком Получите время выполнения видео, воспроизводимого при видеообъявлении? Расширения OpenGL, доступные на разных устройствах Android Android LinearGradient XML Android GCM (push-уведомление): устройство не получает уведомления, если приложение остановлено Пользовательские команды для Google Now Не удалось разрешить целевое «андроид-16» Android: подскажите пользователю сохранить изменения при нажатии кнопки «Назад» Ошибка при анализе содержимого Android sdk и инициализации java-инструментов в eclipse Есть ли способ автоматически генерировать геттеры и сеттеры в Eclipse? В чем разница между начальным / конечным маржем Android и правым / левым? Поддерживают ли браузеры iPhone / Android браузер CSS @media? Pinterest как пользовательский GridView Android: Как включить / отключить пункт меню выбора при нажатии кнопки?

Ошибка 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 ) для использования. Завершение дескриптора файла является обязанностью вызывающего абонента. Это безопасно сделать, как только этот вызов вернется .