Android AudioRecord questions?
J'ai été déconner avec le AudioRecord fonction de l'API Android et a trouvé quelques comportements étranges avec elle.
Des informations de base:
Mon téléphone est un HTC Incredible
J'utilise le plugin Eclipse pour le développement Android avec l'émulateur.
Plateforme ciblée ou OS est de 2,2... Puisque c'est ce que mon téléphone utilise.
Code:
bufferSize = AudioRecord.getMinBufferSize(FREQUENCY, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
C'est le code que j'utilise pour l'installation de l'AudioRecord de l'API. Maintenant, pour l'émulateur, il aime la FRÉQUENCE à définir à 8000 pour que cela fonctionne. Revient avec un tampon de taille 640. Pour le téléphone je utiliser 44100. Un seul problème ici est parait-il la résultante de données PCM pour la vague semble être un huit bits signé vague. Je reçois des valeurs de -127 à 128. Je pensais que la valeur AudioFormat.ENCODING_PCM_16BIT
serait de produire quelque chose de différent.
Je traiter l'audio avec un fil,
public void run() {
while(isRecording) {
audioRecord.startRecording();
byte[] data = new byte[bufferSize];
audioRecord.read(data, 0, bufferSize);
listener.setData(data);
handleData(data);
}
audioRecord.release();
}
J'ai une façon d'afficher sous forme graphique correspondant à l'onde en temps réel à l'aide d'un SurfaceView
. Il semble y avoir beaucoup de bruit venant de la MIC. Je reçois ce bruit à partir de l'émulateur et le téléphone. Ai-je besoin pour exécuter les données à travers une sorte de filtre(s)? Je voudrais utiliser ces données pour calculer le plaisir de la FFT et des trucs juste pour jouer avec les vagues. Mais j'ai besoin de réduire le bruit en quelque sorte.
Quelqu'un d'autre a de l'expérience. Quelqu'un aurait-il une solution?
J'ai apprécié votre temps et de vos réponses,
merci,
dk
OriginalL'auteur dakira | 2011-01-16
Vous devez vous connecter pour publier un commentaire.
Quand vous lisez octets à partir d'un "AudioFormat.ENCODING_PCM_16BIT" stream, en effet, il vous donne à la fois le haut et le bas octets de chaque échantillon 2 séquentielle octets. Cela semble extrêmement bruyant, si vous venez de prendre chaque octet d'un échantillon (au lieu de la moitié de l'échantillon, il est effectivement), en plus de la signature de mal pour le premier octet (c'est en little endian).
Pour obtenir des données, des flux, de la lecture via les shorts, par exemple
OriginalL'auteur Grant Peters
Il a été un moment depuis que cette question a été posée, donc je ne sais pas si réponse il est.
La raison pour laquelle vous êtes à l'obtention de valeurs de -127 à 128, c'est que vous êtes en train de lire dans un tableau d'octets, chacun de qui tenir signé un nombre de 8 bits. Pour les 16-bit audio, lu dans un tableau de short.
Je crains que je ne peux pas aider avec le problème de bruit.
J'ai aussi un problème similaire, merci de voir ma question sur stackoverflow.com/questions/9413998/....... à l'aide!!!
OriginalL'auteur Peter
Je pourrais peut-être aider un petit peu. Cependant, je suis dans la même situation que vous et je ne peux donc vous parler de mes expériences.
Je crois que vous pouvez obtenir de votre appareil préféré taux d'échantillonnage:
La 16 bits mode de codage est le seul qui fonctionne avec AudioRecord. Je ne suis pas certain pourquoi vous obtenez 8Bit comme sortie (à droite?). Peut-être quelqu'un sait.
Je suis également pas sûr de la façon dont vous tirez l'amplitude de l'extrait octets, avez-vous fait cela?
Enfin, je crois que vous avez besoin d'utiliser le périodique de l'auditeur fonctions comme:
Il y a deux grandes questions auxquelles je ne peux répondre et vous souhaitez connaître la réponse de moi-même ainsi:
Je souhaite que je pourrais aider plus.
intervalFrames est le nombre d'échantillons que vous voulez être informé pour, si vous êtes d'échantillonnage à 8000, intervalFrames = 4000 voudrais appeler votre notification de l'écouteur de tous les 1/(8000/4000) = 0.5 secondes. Vous avez besoin pour commencer votre lecture pour la fonction d'écoute à être appelé, aussi, vous devez vous assurer que votre taille de tampon de lecture est >= intervalFrames.
+1 pour getNativeOutputSampleRate(); Comment u résolu votre problème ? Je suis également aux prises avec le même problème ? stackoverflow.com/questions/9413998/...
Je ne suis pas en mesure de créer AudioRecord Instance dans l'émulateur en utilisant getNativeOutputSampleRate()... peut-on savoir pourquoi ?
2. Why are the listener methods never called?
. C'est parce que vous devez appeler read() juste après que vous avez commencé l'enregistrement.Qui est, l'auditeur est appelé après que l'intervalle est atteint(intervalle de lecture intervalFrames de AudioRecord.)aRecorder.startRecording(); aRecorder.read(buffer, 0, buffer.length);
si vous ajoutez ces lignes, le callback sera appeléOriginalL'auteur Tom
Ce projet open source a une bonne quantité de classes d'assistance pour vous aider à acquérir les données audio et d'expérimenter avec l'analyse de l':
https://github.com/gast-lib/gast-lib
Il a un AsyncTask
Il a quelque chose qui contrôle Enregistreur audio
Il a même un simple fréquence de l'algorithme d'estimation
OriginalL'auteur gregm