MediaPlayer error -2147483648 al reproducir archivos en almacenamiento interno
Estoy usando la muestra de captura de audio en android.com para grabar y reproducir audio en dispositivos reales. (Touch pad Motorola y Samsung Galaxy S).
Cuando defino la ruta del archivo de audio como
- ¿Determinar la estructura de opencore o stagefright para mediaplayer?
- Reproducción de vídeo mediante la clase MediaPlayer
- ¿Qué significa MediaPlayer info / warning (973, 0)?
- IllegalStateException que llama a MediaPlayer.reset ()
- La aplicación de vista web de Android no permite que el reproductor de video pase a pantalla completa
mFile = Environment.getExternalStorageDirectory().getAbsolutePath();
Grabación y reproducción.
Pero si configuro el archivo de audio como
mFile = getFilesDir().getAbsolutePath();
O
mFile = getDir("media", Context.MODE_PRIVATE).getAbsolutePath();
O
mFile = getDir("media", Context.MODE_WORLD_READABLE).getAbsolutePath();
Parece funcionar, pero la reproducción falla
ERROR / MediaPlayer (4559): error (1, -2147483648)
¿Qué función devolverá el directorio de almacenamiento interno correcto para guardar archivos de audio para su reproducción sólo en mi aplicación ?
El código en cuestión está en mi función onCreate
. (En el ejemplo, lo tienen en el Constructor, pero lo moví a onCreate porque de lo contrario getFilesDir () y getDir () no tienen contexto para trabajar.)
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); // ... }
Cuando grabo en el almacenamiento externo (y la reproducción funciona correctamente), el registro se ve así:
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
Cuando grabo en el almacenamiento interno (y falla), el registro tiene este aspecto:
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
Las secciones de grabación del registro parecen en gran medida iguales para mí, así que creo que es la grabación, pero no sé cómo comprobar el archivo de ninguna manera además de jugarlo. D
El registro de errores es similar cuando uso getDir ().
- MediaPlayer.seekTo () no funciona para la posición sin búfer
- Cargar un MediaPlayer desde un Uri en un contexto de activos
- El tipo mime de la salida de grabación de audio se establece como video
- Instancia de MediaPlayer: stop se comporta como una pausa
- Android: función de setVolume de MediaPlayer
- Android MediaPlayer atascado en preparar ()
- Android: mediaplayer se fue con eventos no controlados
- Android MediaPlayer getCurrentPosition () hace que el audio tartamudea
Gracias a gtkandroid :
En lugar de mPlayer.setDataSource(mFile);
Hice esto:
FileInputStream fileInputStream = new FileInputStream(mFile); mPlayer.setDataSource(fileInputStream.getFD()); fileInputStream.close(); mPlayer.prepare();
Tim Crowley tiene razón. Una mejor práctica es cerrar la corriente, como esto:
FileInputStream stream = new FileInputStream(path); mediaPlayer.setDataSource(stream.getFD()); stream.close();
Se observa en la documentación del método:
android.media.MediaPlayer.setDataSource(FileDescriptor fd)
Establece el origen de datos (
FileDescriptor
) a utilizar. Es responsabilidad de la persona que llama a cerrar el descriptor de archivo. Es seguro hacerlo tan pronto como regrese esta llamada .
- Android studio no reconoce el emulador en ejecución
- Android: No se ha encontrado actividad para manejar el error de intención? Cómo va a resolver