Quelle est la meilleure façon d'obtenir un fichier audio durée dans Android?
Je suis en utilisant un SoundPool à jouer des clips audio dans mon application. Tout est très bien, mais j'ai besoin de savoir quand la lecture du clip est terminé.
Au moment où je trace dans mon application par l'obtention de la durée de chaque élément à l'aide d'un MediaPlayer instance. Cela fonctionne bien mais il semble un gaspillage de charger chaque fichier deux fois, juste pour obtenir la durée. J'ai pu calculer approximativement la durée de me connaissant la longueur de la file (disponible à partir de la AssetFileDescriptor), mais j'ai encore besoin de connaître la fréquence d'échantillonnage et le nombre de canaux.
Je vois deux solutions possibles à ce problème:
- De déterminer quand un clip a fini de jouer (ne semble pas être possible avec SoundClip).
- Avoir une classe qui pourrait charger juste l'en-tête d'un fichier audio et de me donner le taux d'échantillonnage/nombre de canaux (et, idéalement, le nombre d'échantillon pour obtenir la durée exacte).
Des suggestions?
Grâce,
Max
Le code que j'utilise en ce moment (fonctionne très bien mais est assez lourd pour la fin):
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();
//...
}
Sur une note de côté, cette question a déjà été demandé mais n'ai reçu aucune réponse.
onCompletitionListener
? developer.android.com/reference/android/media/...cela ne fonctionne pas (jamais appelé) sur l'un des périphériques que j'ai. Même si elle est appelée sur certaines versions d'OS / certains appareils, il est peu fiable et donc inutiles.
vous re-vérifier tout que
setOnCompletitionListner
est appelée après .start()
?L'achèvement de l'écouteur est utilisé uniquement pour MediaPlayer, pas pour SoundPool. Autant que je sache, la seule façon d'avoir un rappel sur une bonne finition, avec un lecteur multimédia, pas un SoundPool.
OriginalL'auteur Gilead | 2011-01-17
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé ceci:
Mais je ne suis pas exactement sûr que c'est plus léger que le code existant.
MediaMetadataRetriever
J'ai essayé ceci, mais je suis toujours jeté une IllegalArgumentException de
mmr.setDataSource()
- est-il possible de savoir comment faire exactement ce chemin devrait ressembler? Parce que je suis penser que le chemin que j'ai utiliser est peut-être incorrect. Je suis, en utilisant le bundle .m4a et/ou .les fichiers audio wav.réponse parfaite +1
pas de travail pour moi toujours obtenir la durée 0
OriginalL'auteur Meher
Essayer FFmpegMediaMetadataRetriever:
OriginalL'auteur William Seemann
en fait j'écris le code pour obtenir la durée de n'importe quel fichier audio dans des actifs @William Seemann écrire, mais j'utilise MediaMetadata pour récupérer la durée...je modifie ma réponse afin que vous compreniez mieux...vous pouvez appeler cette méthode pour plusieurs fichier audio pour obtenir la durée.
Je ne l'ai pas écrit de commentaire parce que je n'étais pas en mesure de comprendre votre code, mais c'est une bonne pratique sur DONC pour accompagner votre solution avec les explications appropriées. Code-Seulement les réponses ne sont pas très appréciés.
OriginalL'auteur Manthan Patel