2010-11-04 5 views
5

Je suis conscient que SoundPool était destiné à gérer les petits sons comme fx et je me suis assuré que mes 4 clips sonores que je veux jouer un par un dans une séquence sont assez petits.et encore sur les problèmes de mémoire avec SoundPool

J'ai utilisé la qualité ogg 0 et les clips sont 35kb, 14kb, 21kb et 23kb totalisant 92kb d'audio compressé. Je n'ai aucune idée de comment estimer la taille non compressée, mais ça ne devrait pas être beaucoup, n'est-ce pas? Donc, quand je joue 4 sons en séquence, cela fonctionne bien pour les 9 premières fois (9 séquences x 4 sons) mais commence à causer des problèmes de mémoire sur la séquence de neuf pour l'un des sons. C'est toujours la séquence 9 quand je commence à voir l'erreur.

Quelle est la meilleure façon de gérer cela? J'ai quelques idées:

1) compress sons encore plus (qualité ogg -1 et mono au lieu de stéréo)

2) décharger et charger des sons en utilisant constamment SoundPool.load et SoundPool.unload

3) libérer et recréer le temps de l'instance soundPool à partir du temps

Y at-il autre chose que je peux faire? Il est embarrassant que api android ne peut pas gérer si petits clips. Je me demande comment les gens créer des jeux avec beaucoup d'effets sonores ...

erreurs ressemblent que:

ERREUR/AudioFlinger (35): pas assez de mémoire pour AudioTrack size = 1048640 DEBUG/MemoryDealer (35) : AudioTrack (0x25018, size = 1048576)

Répondre

2

Il semble que j'ai pu résoudre mon problème après:

1) mes sous-échantillonnées clips sonores de 44 à 22 kHz. La taille non comprimée a été réduite de moitié (j'ai calculé comment estimer la taille du son non compressé - exporter votre clip en wav non compressé). J'ai utilisé bel outil open source Audacity

2) couper les sons plus pour réduire la durée

3) mettre try/catch autour de jeu() juste au cas où (il fait des erreurs de capture quand il essaie de jouer le son, mais ne peut pas)

+0

Merci cela fonctionne pour moi. Avant que mon fichier son se coupe. Mais j'ai converti et rééchantillonné ce m4a de 44 à 22 et maintenant ça marche sans se faire couper. –

0

Cela semble étrange. SoundPool devrait étendre vos clips audio en mémoire quand ils les chargent, et une fois chargé je ne m'attendrais pas à ce que vous rencontriez des problèmes de mémoire plus tard. Quand j'ai eu des problèmes de mémoire, c'était au début, pas plus tard. Vous êtes sûr de ne plus charger de sons plus tard?

Pour répondre à votre autre question, certains jeux utilisent des sons JET Player et MIDI au lieu de SoundPool. L'exemple de programme JetBoy fourni avec le SDK Android est un excellent exemple de ce type de travail sonore dans une application.

+0

merci pour la réponse ... J'ai testé mon application plus aujourd'hui et j'ai remarqué que ce problème se produit avec 4 sons que je boucle en utilisant le bouclage soundpool. J'ai chargé 17 autres clips et ils fonctionnent bien, mais après que mon application déclenche l'un des 4 clips en boucle, il se bloque. Je les précharge tous lorsque l'activité est créée et nulle part ailleurs. J'ai sous-échantillonné mes clips de 44 à 22khz et cela m'a aidé un peu, mais l'application se bloque toujours avec un problème de mémoire. – mishkin

+0

j'ai besoin de jouer ogg fichiers donc je suppose que JetBoy n'est pas une option pour moi mais merci pour suggestion – mishkin

Questions connexes