2011-06-17 12 views
23

Estoy usando el Audio Capture sample on android.com para grabar y reproducir audio en dispositivos reales. (Teclado táctil de Motorola y Samsung Galaxy S).MediaPlayer error -2147483648 al reproducir archivos en el almacenamiento interno

Cuando defino la ruta del archivo de audio como

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

de grabación y reproducción de obras.

Pero si fijo el archivo de audio como

mFile = getFilesDir().getAbsolutePath(); 

OR

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

O

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

registro parece funcionar, pero la reproducción falla con

ERROR/MediaPlayer (4559): error (1, -2147483648)

Qué función devolverá el directorio correcto almacenamiento interno para guardar archivos de audio para su reproducción sólo dentro de mi aplicación?

El código en cuestión está en mi función onCreate. (En el ejemplo, lo tienen en el constructor, pero movido a onCreate porque de lo contrario getFilesDir() y getDir() no tienen ningún 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 almacenamiento externo (y la reproducción funciona correctamente), el registro es el siguiente:

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 al almacenamiento interno (y pierde), el registro es el siguiente:

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 de la mirada de registro l Argely es lo mismo para mí, así que creo que está grabando, pero no sé cómo revisar el archivo de ninguna manera además de reproducirlo. ;-)

El registro de errores es similar cuando uso getDir().

Respuesta

23

Thanks to gtkandroid:

En lugar de mPlayer.setDataSource(mFile); Hice esto:

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

Gracias chicos por la sugerencia .close(); Acabo de agregarlo a mi respuesta. –

3

Tim Crowley es correcto.Una mejor práctica es cerrar el flujo, así:

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 la fuente de datos (FileDescriptor) para su uso. Es la responsabilidad del llamador a cerrar el descriptor del archivo. Es seguro hacerlo como tan pronto como esta llamada devuelva.

Cuestiones relacionadas