Lorsque je joue un fichier avec le code suivant: La seule chose que j'entends est statique, bruit blanc. J'ai vérifié que mon fichier .wav a les mêmes propriétés (samplate, débit). Je n'ai pas besoin de beaucoup de connaissances sur les données audio brutes (PCM), alors je me demandais si quelqu'un pouvait voir ce qui ne va pas avec mon code. P> P>
3 Réponses :
Cela semble très compliqué que ce que j'ai fait. J'ai joué des sons en utilisant ceci. Je pense que les fichiers .wav travailleraient aussi bien.
MediaPlayer mpStart = MediaPlayer.create(this, resID); mpStart.start(); mpStart.release();
Je n'utilise pas la classe MediaPlayer car il est très élevé. J'utilise audiotrack, qui est meilleur pour ce que je fais.
à partir de votre code, je peux voir que vous venez de lire les données du fichier WAV et de les importer à l'audiotrack. Les fichiers WAV ont une petite en-tête que vous pouvez voir ici https: //ccrma.stanford. EDU / Cours / 422 / Projets / WaveFormat / Vous devez donc sauter l'en-tête et pointez votre descripteur de fichier au bon endroit où les données audio réelles sont.
Aussi lorsque vous jouez un fichier audio et que vous êtes Traiter avec les opérations d'octets, vous devriez prendre soin de l'endianesse. Jetez un coup d'œil ici Utiliser audiotrack dans Android pour jouer un fichier WAV < / a> p> ci-dessous mon code (certains chèques et le saut d'en-tête WAV sont manquants) qui fonctionne à la fois chez Nexus One et Galaxy S avec un fichier WAV avec une fréquence 8000Hz et un codage 16 bits. P> < Pré> xxx pré> p>
L'en-tête suffirait juste pour quelques millisecondes de son, il devrait jouer normal après cela. Pourriez-vous m'expliquer ce que vous voulez dire avec «prendre soin de l'endianesse»?
Oh, désolé mon erreur à propos de l'endianesse. Je pensais que vous lisiez les données comme shorts mais que vous lisez comme des octets si endianess, ce n'est pas un problème ici. Pour être sûr que j'ai écrit un petit programme (je peux fournir le code source) qui lit le fichier .wav et l'écrit à Audiottrack. Il joue le fichier WAV normalement sur mon téléphone. Peut-être que vos paramètres de configuration sur le constructeur d'AudioTrack peuvent être faux. Avez-vous vérifié les propriétés de votre fichier WAV? Peut-être qu'il a une fréquence d'échantillonnage différente ou un codage.
Hmmm, assez étrange ... j'ai ajouté à ma première réponse mon code. Comme vous pouvez voir la façon dont je gère l'audiotrack est la même. La seule différence est l'ouverture et la lecture du fichier. Ajoutez des messages de débogage à LOGCAT pour voir si quelque chose ne va pas dans ces opérations.
Je suggérerais deux autres expériences: 1) Essayez de zéro du tampon et de l'écrire - aucun bruit blanc doit être présent dans ce cas; 2) Essayez d'inversion du short (c'est-à-dire de la conversion de l'endian)
@Manos: Nice code. Est-il possible de changer d'octet [] S en bref [] s? Parce que je veux calculer RMS à partir de ces données, mais cela ne corrige que pour le type court []. Merci
@ user8264, oui cela est possible. Vous devez utiliser la fonction écrire () code> de
audiotrack code> qui prend comme paramètre un vecteur de shorts.
Si vous avez enregistré le fichier de fichier WAV et que vous souhaitez la lire à l'aide de l'audiotrack, suivez ce code:
File file=new File(Environment.getExternalStorageDirectory()+"/AudioRecorder/fahim.wav"); InputStream is; DataInputStream dis = null ; BufferedInputStream bis; try { is = new FileInputStream(file); bis = new BufferedInputStream(is, 8000); dis = new DataInputStream(bis); // Create a DataInputStream to read the audio data from the saved file } catch (FileNotFoundException e1) { ShowToast("fILE NOT FOUND:"+e1.getMessage()); } int i = 0; // Read the file into the "music" array music=new byte[(int) file.length()]; try { while (dis.available() > 0) { music[i] = dis.readByte(); // This assignment does not reverse the order i++; } } catch (IOException e) { ShowToast("I/O Exception:"+e.getMessage()); } try {dis.close();} catch (IOException e) {e.printStackTrace();} int minBufferSize = AudioTrack.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); at.play(); ShowToast("size:"+music.length); //*/ at.write(music, 0, music.length);