Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cuál es la mejor manera de obtener una duración de archivo de audio en Android?

Estoy usando un SoundPool para reproducir clips de audio en mi aplicación. Todo está bien, pero necesito saber cuándo ha terminado la reproducción del clip.

Por el momento lo rastreo en mi aplicación mediante la obtención de la duración de cada clip utilizando una instancia de MediaPlayer . Eso funciona bien, pero parece un derroche para cargar cada archivo dos veces, sólo para obtener la duración. Podría calcular aproximadamente la duración de mí mismo sabiendo la longitud del archivo (disponible de AssetFileDescriptor ) pero todavía necesitaría saber la tarifa de la muestra y el número de canales.

  • Práctica recomendada para instanciar un nuevo fragmento de Android
  • Comprueba si está habilitado 'Acceso a mi ubicación' - Android
  • Resolución de imagen para mdpi, hdpi, xhdpi y xxhdpi
  • Softkey superposición con el campo EditText
  • No se puede eliminar la acción javaCompile antigua, tal vez el nombre de la clase ha cambiado
  • Cómo establecer el tamaño de dibujo en la lista de capas
  • Veo dos posibles soluciones a ese problema:

    1. Averiguar cuándo ha terminado de reproducir un clip (no parece posible con SoundClip).
    2. Tener una clase que podría cargar sólo el encabezado de un archivo de audio y me dan la frecuencia de muestreo / número de canales (e idealmente, el recuento de muestras para obtener la duración exacta).

    ¿Alguna sugerencia?

    Gracias, Max

    El código que estoy usando en este momento (funciona bien, pero es bastante pesado para el propósito):

    String[] fileNames = ... MediaPlayer mp = new MediaPlayer(); for (String fileName : fileNames) { AssetFileDescriptor d = context.getAssets().openFd(fileName); mp.reset(); mp.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); mp.prepare(); int duration = mp.getDuration(); // ... } 

    En una nota lateral, esta pregunta ya se ha hecho, pero no obtuvo respuestas.

  • R no se puede resolver - Android, sin importar android.R; declaración
  • Listview - Pie de página en la parte inferior de la pantalla
  • Android Facebook SDK 4.0.0 Compartir la devolución de llamada no funciona correctamente
  • Prueba de AsyncTaskLoaders con Robolectric
  • ¿Cómo puedo detener la capitalización automática en un campo de introducción de texto html en un teléfono Android / Samsung?
  • ¿Cómo puedo configurar el color estrella de la barra de calificación?
  • 3 Solutions collect form web for “¿Cuál es la mejor manera de obtener una duración de archivo de audio en Android?”

    ¿Has probado esto:

     String mediaPath = Uri.parse("android.resource://<your-package-name>/raw/filename").getPath(); MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(mediaPath); String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); mmr.release(); 

    Pero no estoy exactamente seguro de que esto es más ligero que el código existente.

    Intente FFmpegMediaMetadataRetriever :

     String[] fileNames = ... FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever(); for (String fileName : fileNames) { AssetFileDescriptor d = context.getAssets().openFd(fileName); mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); String duration = mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION); } mmr.release(); 

    Esto es trabajo para mí para obtener activos audio duración del archivo en segundos totales =====>

     MediaMetadataRetriever mmr = new MediaMetadataRetriever(); AssetFileDescriptor d = context.getAssets().openFd(fileName); mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); mmr.release(); 

    Actualizado

    Método para obtener la duración del archivo de audio activos en segundos

      public String gettotaltimeassets() { MediaMetadataRetriever mmr = new MediaMetadataRetriever(); AssetFileDescriptor d = null; try { d = getApplicationContext().getAssets().openFd("ASSETS FILE NAME"); } catch (IOException e) { e.printStackTrace(); } mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); long dur = Long.parseLong(duration); String seconds = String.valueOf((dur % 60000) / 1000); Log.d("seconds===========>", seconds); mmr.release(); return seconds; } 

    Método para obtener la duración del archivo de audio de almacenamiento interno en segundos

     public String gettotaltimestorage(String filePath) { // load data file Log.d("time=================>","time=================>"); MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); metaRetriever.setDataSource(YourACTIVITY.this, Uri.parse(filePath)); Log.d("time=================>","time=================>"); String out = ""; // get mp3 info // convert duration to minute:seconds String duration = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); Log.d("time=================>", duration); long dur = Long.parseLong(duration); String seconds = String.valueOf((dur % 60000) / 1000); Log.d("seconds===========>", seconds); // close object metaRetriever.release(); return seconds; } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.