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.

  • Acceso a localhost: puerto del emulador de Android
  • Fragmento en ViewPager utilizando FragmentPagerAdapter está en blanco la segunda vez que se ve
  • Android Live Wallpaper prácticas de rendimiento y ahorro de la batería?
  • Desactivar el uso de Android hasta que se confirme la acción intencionada
  • Cómo detener el teléfono de la carga a través de USB mediante programación
  • ¿Cómo hacer que la barra Contextual ActionMode se superponga a la barra de herramientas appcompat-v7 pero no al cajón de navegación?
  • 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.

  • Phonegap Actualización de actualizaciones de aplicaciones de Android mediante programación
  • Android DownloadManager API - abrir el archivo después de descargar?
  • SpeechRecognizer causa ANR ... Necesito ayuda con Android speech API
  • Hacer que un servicio androide de Python funcione en estado de suspensión
  • Mantenga la barra de acción estable durante la animación de transición de actividad
  • Cómo Android SharedPreferences guarda / almacena un objeto
  • 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.