studio programacion herramientas fundamentos con avanzado aplicaciones android audio audio-recording duration

programacion - manual de android en pdf



obtener la duraciĆ³n del archivo de audio (6)

Después de escribir el archivo, ábralo en un MediaPlayer y llame a getDuration sobre él.

He creado una aplicación de grabadora de voz y quiero mostrar la duración de las grabaciones en una vista de lista. Guardo las grabaciones así:

MediaRecorder recorder = new MediaRecorder(); recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); folder = new File(Environment.getExternalStorageDirectory() + File.separator + "Audio recordings"); String[] files = folder.list(); int number = files.length + 1; String filename = "AudioSample" + number + ".mp3"; File output = new File(Environment.getExternalStorageDirectory() + File.separator + "Audio recordings" + File.separator + filename); FileOutputStream writer = new FileOutputStream(output); FileDescriptor fd = writer.getFD(); recorder.setOutputFile(fd); try { recorder.prepare(); recorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { Log.e(LOG_TAG, "prepare() failed"); e.printStackTrace(); }

¿Cómo puedo obtener la duración en segundos de este archivo?

Gracias por adelantado

--- EDITAR Lo tengo funcionando, llamé a MediaPlayer.getduration () dentro del método MediaPlayer.setOnPreparedListener () para que devolviera 0.


Intenta usar

long totalDuration = mediaPlayer.getDuration(); // to get total duration in milliseconds long currentDuration = mediaPlayer.getCurrentPosition(); // to Gets the current playback position in milliseconds

División en 1000 para convertir a segundos.

Espero que esto te haya ayudado.


Pruebe esto para obtener la duración en milisegundos:

MediaPlayer mp = MediaPlayer.create(yourActivity, Uri.parse(pathofyourrecording)); int duration = mp.getDuration();

O mida el tiempo transcurrido desde recorder.start() hasta recorder.stop() en nanosegundos:

long startTime = System.nanoTime(); // ... do recording ... long estimatedTime = System.nanoTime() - startTime;


¿Has mirado a Ringdroid ? Es muy ligero y la integración es directa. Funciona bien con archivos de medios VBR también.

Para su problema con la duración, es posible que desee hacer algo como a continuación utilizando Ringdroid.

public class AudioUtils { public static long getDuration(CheapSoundFile cheapSoundFile) { if( cheapSoundFile == null) return -1; int sampleRate = cheapSoundFile.getSampleRate(); int samplesPerFrame = cheapSoundFile.getSamplesPerFrame(); int frames = cheapSoundFile.getNumFrames(); cheapSoundFile = null; return 1000 * ( frames * samplesPerFrame) / sampleRate; } public static long getDuration(String mediaPath) { if( mediaPath != null && mediaPath.length() > 0) try { return getDuration(CheapSoundFile.create(mediaPath, null)); }catch (FileNotFoundException e){} catch (IOException e){} return -1; } }

Espero que ayude


MediaMetadataRetriever es una forma liviana y eficiente de hacer esto. MediaPlayer es demasiado pesado y podría surgir un problema de rendimiento en entornos de alto rendimiento como desplazamiento, paginación, listado, etc.

Además, el Error (100,0) podría ocurrir en MediaPlayer ya que es pesado y algunas veces se debe reiniciar una y otra vez.

Uri uri = Uri.parse(pathStr); MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(AppContext.getAppContext(),uri); String durationStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); int millSecond = Integer.parseInt(durationStr);


La forma más rápida de hacerlo es a través de MediaMetadataRetriever . Sin embargo, hay una trampa

si usa el URI y el contexto para establecer la fuente de datos, puede encontrar el error https://code.google.com/p/android/issues/detail?id=35794

La solución es usar la ruta absoluta del archivo para recuperar los metadatos del archivo multimedia.

A continuación se muestra el fragmento de código para hacerlo

private static String getDuration(File file) { MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(file.getAbsolutePath()); String durationStr = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); return Utils.formateMilliSeccond(Long.parseLong(durationStr)); }

Ahora puede convertir milisegundos en formato legible para el ser humano utilizando cualquiera de los formatos siguientes

/** * Function to convert milliseconds time to * Timer Format * Hours:Minutes:Seconds */ public static String formateMilliSeccond(long milliseconds) { String finalTimerString = ""; String secondsString = ""; // Convert total duration into time int hours = (int) (milliseconds / (1000 * 60 * 60)); int minutes = (int) (milliseconds % (1000 * 60 * 60)) / (1000 * 60); int seconds = (int) ((milliseconds % (1000 * 60 * 60)) % (1000 * 60) / 1000); // Add hours if there if (hours > 0) { finalTimerString = hours + ":"; } // Prepending 0 to seconds if it is one digit if (seconds < 10) { secondsString = "0" + seconds; } else { secondsString = "" + seconds; } finalTimerString = finalTimerString + minutes + ":" + secondsString; // return String.format("%02d Min, %02d Sec", // TimeUnit.MILLISECONDS.toMinutes(milliseconds), // TimeUnit.MILLISECONDS.toSeconds(milliseconds) - // TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds))); // return timer string return finalTimerString; }