Exemple de code pour Android AudioTrack Mélange
J'ai deux sons PCM fichier dans le dossier de ressources. J'ai utilisé inputstream et converti en objet bytearray.
Puis j'ai traité par normalisé et en ajoutant de la musique 1 et de la musique2 et de sortie pour le tableau d'octets de sortie. Enfin, placez le tableau de sortie et le nourrir à la AudioTrack.
Évidemment, je n'entends rien et quelque chose est faux.
private void mixSound() throws IOException {
InputStream in1=getResources().openRawResource(R.raw.cheerapp2);
InputStream in2=getResources().openRawResource(R.raw.buzzer2);
byte[] music1 = null;
music1= new byte[in1.available()];
music1=convertStreamToByteArray(in1);
in1.close();
byte[] music2 = null;
music2= new byte[in2.available()];
music2=convertStreamToByteArray(in2);
in2.close();
byte[] output = new byte[music1.length];
audioTrack.play();
for(int i=0; i < output.length; i++){
float samplef1 = music1[i] / 128.0f; // 2^7=128
float samplef2 = music2[i] / 128.0f;
float mixed = samplef1 + samplef2;
//reduce the volume a bit:
mixed *= 0.8;
//hard clipping
if (mixed > 1.0f) mixed = 1.0f;
if (mixed < -1.0f) mixed = -1.0f;
byte outputSample = (byte)(mixed * 128.0f);
output[i] = outputSample;
audioTrack.write(output, 0, i);
} //for loop
public static byte[] convertStreamToByteArray(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buff = new byte[10240];
int i = Integer.MAX_VALUE;
while ((i = is.read(buff, 0, buff.length)) > 0) {
baos.write(buff, 0, i);
}
return baos.toByteArray(); //be sure to close InputStream in calling function
}
OriginalL'auteur jason white | 2013-02-27
Vous devez vous connecter pour publier un commentaire.
J'ai essayé votre code (en remplacement de certains fichiers audio de mon propre). J'ai initialisé un AudioTrack exemple comme ceci, j'espère que c'est similaire à la façon dont vous l'avez fait:
Et a essayé de l'exécuter. Il fait un bruit aigu, qui a obtenu plus faible que le temps passait. J'ai vérifié le code et le problème, c'est que vous êtes à la rédaction de l'ensemble de la sortie de tableau d'octets à la audioTrack à chaque itération de la boucle dans votre mixSound() la méthode.
la ligne
besoins déplacé à l'extérieur de la boucle et d'être modifiés à
Si vous mélangez les deux fichiers ensemble dans la sortie de tableau d'octets, puis écrire la totalité de chose à la fois.
De sorte que le code du travail mixSound méthode ressemble à ceci:
Qui pourrait se produire si votre second fichier audio est plus courte que la première. Le tableau de sortie est initialisé à la longueur du premier fichier audio, et la boucle for parcourt la longueur du tableau de sortie. Donc, vous pourriez finir vers le haut de la lecture-delà de la fin de la deuxième fichier audio. La solution serait d'ajouter une protection autour de l'endroit où vous lisez samplef2. Si i > la musique2.longueur vous devez définir sample2f de 0 (vous avez atteint la fin du clip).
OriginalL'auteur combinatorics