Utilisation de AudioTrack dans Android pour lire un fichier WAV

Je travaille avec Android, essayant de faire mon application AudioTrack jouer un fichier Windows .wav (Tada.wav). Franchement, ça ne devrait pas être aussi difficile, mais j'entends beaucoup de choses étranges. Le fichier est enregistré sur la mini carte SD de mon téléphone et la lecture du contenu ne semble pas être un problème, mais quand je joue au fichier (avec les paramètres, je suis juste PRETTY SURE sont à droite), j'ai quelques secondes de bruit blanc Avant que le son ne semble se résoudre à quelque chose qui pourrait être juste.

J'ai enregistré avec succès et joué ma propre voix sur le téléphone – J'ai créé un fichier .pcm selon les instructions de cet exemple:

  • Que faire lorsque - java.io.FileNotFoundException: Aucun fournisseur de contenu?
  • Comment obtenir le décalage d'une vue dans une ScrollView?
  • Usage Android "Best Practice" des intouts
  • Erreur "Impossible d'obtenir BatchedBridge, assurez-vous que votre paquet est correctement emballé" au démarrage de l'application
  • Je souhaite avoir un nombre de semaines dans un mois particulier
  • Des chances de réduire le temps d'obturation avec l'accès à la caméra Android NDK?
  • Http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

    (Sans le masquage vers l'arrière) …

    Quelqu'un a-t-il des suggestions ou une prise de conscience d'un exemple sur le Web pour jouer un fichier .wav sur Android?

    Merci, R.

  • Référence du projet Android Ant
  • Comment puis-je obtenir mon code de pays de périphérique Android sans utiliser le GPS?
  • Changer la visibilité des widgets sur le clic
  • Fenêtre contextuelle dans n'importe quelle application
  • Comment vérifier si le bluetooth est activé par programme?
  • Est-il toujours sécuritaire de lancer Context to Activity dans View
  • 5 Solutions collect form web for “Utilisation de AudioTrack dans Android pour lire un fichier WAV”

    Je suis tombé sur la réponse (franchement, en essayant & ^ @! Je ne pensais pas fonctionner), au cas où quelqu'un serait intéressé … Dans mon code d'origine (qui est dérivé de l'exemple dans le lien dans le post original) Les données sont lues à partir du fichier comme suit:

    InputStream is = new FileInputStream (file); BufferedInputStream bis = new BufferedInputStream (is, 8000); DataInputStream dis = new DataInputStream (bis); // Create a DataInputStream to read the audio data from the saved file int i = 0; // Read the file into the "music" array while (dis.available() > 0) { music[i] = dis.readShort(); // This assignment does not reverse the order i++; } dis.close(); // Close the input stream 

    Dans cette version, la musique [] est une gamme de SHORTS. Donc, la méthode readShort () semble logique ici, car les données sont PCM 16 bits … Cependant, sur Android, cela semble être le problème. J'ai changé ce code pour ce qui suit:

      music=new byte[(int) file.length()];//size & length of the file InputStream is = new FileInputStream (file); BufferedInputStream bis = new BufferedInputStream (is, 8000); DataInputStream dis = new DataInputStream (bis); // Create a DataInputStream to read the audio data from the saved file int i = 0; // Read the file into the "music" array while (dis.available() > 0) { music[i] = dis.readByte(); // This assignment does not reverse the order i++; } dis.close(); // Close the input stream 

    Dans cette version, la musique [] est un tableau de BYTES. Je dis toujours à AudioTrack qu'il s'agit de données PCM 16 bits, et mon Android ne semble pas avoir de problème avec l'écriture d'un ensemble d'octets dans un AudioTrack ainsi configuré … En fin de compte, il semble bien être le cas, donc si quelqu'un Else veut jouer des sons Windows sur leur Android, pour une raison quelconque, c'est la solution. Ah, Endianness ……

    R.

    Serez-vous en train de sauter les premiers 44 octets du fichier avant de jeter le reste des données du fichier dans le tampon? Les premiers 44 octets sont l'en-tête WAVE et ils ressemblent à un bruit aléatoire si vous avez essayé de les jouer.

    Aussi, êtes-vous sûr de créer le AudioTrack avec les mêmes propriétés que l'WAVE que vous essayez de jouer (taux d'échantillonnage, débit, nombre de canaux, etc.)? Windows fait vraiment un bon travail en vous donnant cette information dans la page Propriétés du fichier: Texte alt

    J'ai trouvé beaucoup de réponses longues à cette question. Ma solution finale, qui donne toute la coupe et le collage est à peine la mienne, se résume à:

     public boolean play() { int i = 0; byte[] music = null; InputStream is = mContext.getResources().openRawResource(R.raw.noise); at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); try{ music = new byte[512]; at.play(); while((i = is.read(music)) != -1) at.write(music, 0, i); } catch (IOException e) { e.printStackTrace(); } at.stop(); at.release(); return STOPPED; } 

    STOPPED est simplement un "vrai" renvoyé comme un signal pour réinitialiser le bouton pause / lecture. Et dans l'initialiseur de classe:

     public Mp3Track(Context context) { mContext = context; minBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); } 

    Le contexte est juste «ceci» de l'activité appelante. Vous pouvez utiliser FileInputStream sur la carte SD, etc. Mes fichiers sont en mode res / raw

    Comme l'a dit Aaron C , vous devez ignorer les 44 octets initiaux ou (comme je le préfère), lire les 44 premiers octets qui sont l'en-tête WAVE. De cette façon, vous savez combien de canaux, bits par échantillon, longueur, etc. … le WAVE contient.

    Ici, vous pouvez trouver une bonne mise en œuvre d'un analyseur d'en-tête WAVE.

    Ne perpétuez pas un code d'analyse terrible. L'analyse de WAV est trivial pour implémenter http://soundfile.sapp.org/doc/WaveFormat/ et vous vous remercierz en analysant des éléments tels que le taux d'échantillonnage, la profondeur de bits et le nombre de canaux.

    De plus, x86 et ARM (au moins par défaut) sont à la fois petits endian, donc les fichiers WAV native-endian devraient être bien sans mélanges.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.