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;
}