2010-10-13 4 views
1

Comment puis-je obtenir le volume du flux audio via le microphone Android?Volume du microphone

+0

Je ne vois que dans les documents comment obtenir les volumes max et min entrant dans le micro. Essayez-vous d'obtenir un volume dynamique pendant l'enregistrement? – Cameron

+0

Non ce serait bien je pense. Cependant, je peux seulement trouver dans les docs getStreamMaxVolume et la seule valeur de flux que je peux trouver qui semble pertinente est: STREAM_VOICE_CALL, est-ce le flux de micro? Est-ce que c'est ce que tu as trouvé? – januszstabik

+0

Toutes les fonctions getStreamMaxVolume() renvoient le volume de sortie de ce flux, et non ce qui est reçu ou traité par le téléphone. –

Répondre

3

Il peut y avoir un moyen plus simple, mais une méthode que je sais fonctionnerait est d'utiliser un objet AudioRecord qui est configuré pour regarder la source audio MediaRecorder.AudioSource.MIC et enregistrer en 8 bits (AudioFormat.ENCODING_PCM_8BIT). Vous auriez besoin d'un thread à exécuter en arrière-plan et d'interroger constamment l'objet pour l'audio avec l'appel read(), qui remplit un tableau d'octets donné avec les données audio du micro. Etant donné que vous enregistrez en 8 bits, la plage maximale de chaque échantillon audio est comprise entre -128 et 127 (bien que je puisse me tromper - cela peut aller de 0 à 256). Vous devriez expérimenter en prenant l'octet de magnitude maximum du tableau d'octets retourné, ou peut-être la moyenne de RMS en fonction des besoins de votre application. La taille du tableau d'octets joue également un rôle dans la détermination de la fréquence à laquelle votre application peut échantillonner le volume audio d'entrée.

+0

Bonjour, pourriez-vous nous fournir un échantillon, ou un peu plus d'explications sur ce que je dois faire avec les données que j'ai capturées . J'ai fait le bit d'enregistrement audio, cependant, 8bit ne fonctionne pas - il semble juste faire planter l'émulateur, donc j'utilise 16 bits PCM à la place, est-ce correct? Si oui, que veut dire "octet de magnitude maximale", est-ce la plus grande valeur d'un tableau donné? – januszstabik

1

Si vous êtes obligé d'enregistrer en PCM 16 bits, vous devrez alors regarder la valeur de chaque autre octet car chaque échantillon s'étendra sur deux octets. L'astuce sera de savoir quel octet regarder - je crois que ce devrait être les octets à index impair retournés dans le tableau d'octets. Ou Si vous voulez une fidélité plus élevée, vous pouvez regarder les deux octets et vous connaîtrez le volume de sortie dans la plage 2^15 plutôt que seulement 2^7.

Étant donné que le type d'octet est signé en Java, vous pouvez simplement regarder tous les octets buffer[index * 2 + 1] et enregistrer le plus grand. Cela vous donnera le volume maximum détecté sur l'échantillon donné.

Comme indiqué dans mon autre réponse, vous pouvez également prendre la moyenne de ces valeurs, en fonction de ce que vous utilisez pour ce numéro.

Questions connexes