Código de ejemplo para Android AudioTrack Mixing

Tengo dos archivos de sonido de PCM en la carpeta de recursos. Utilicé inputstream y los convertí en bytearray.

Entonces los procesé por normalizado y agregando música1 y música2 y salida a la salida de matriz de bytes. Por último, coloque la matriz de salida y alimentar a la AudioTrack.

Obviamente, no escucho nada y algo está mal.

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 } 

Intenté su código (substituyendo en algunos archivos audios mis los propios). He inicializado una instancia de AudioTrack como esta, esperemos que esto sea similar a como lo hiciste:

 AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, 44100, AudioTrack.MODE_STREAM); 

Y trató de ejecutarlo. Hizo un ruido agudo, que bajó a medida que pasaba el tiempo. He comprobado el código y el problema es que está escribiendo toda la matriz de salida de bytes a la pista de audio en cada iteración del bucle en su método mixSound ().

la línea

  audioTrack.write(output, 0, i); 

Necesidades se trasladan fuera del circuito y se

  audioTrack.write(output, 0, output.length); 

Así que mezclar ambos archivos juntos en la matriz de bytes de salida, a continuación, escribir toda la cosa a la vez.

Por lo tanto, el código para el método de trabajo mixSound se ve así:

 private void mixSound() throws IOException { AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, 44100, AudioTrack.MODE_STREAM); InputStream in1=getResources().openRawResource(R.raw.track1); InputStream in2=getResources().openRawResource(R.raw.track2); 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; } //for loop audioTrack.write(output, 0, output.length); } 
  • Android Audiotrack haciendo clic en el ruido desde Android 4 ICS
  • Android - Mezcla de múltiples formas de onda estáticas en un solo AudioTrack
  • AudioTrack muestra inconsistencias
  • attachAuxEffect y OpenSL ES
  • AudioTrack flush () que provoca estática
  • ¿Cómo cambiar el tempo de audio y la individualidad de tono usando ffmpeg?
  • Reproducción de música con buffer de AudioTrack por buffer en Eclipse - sin sonido
  • Audio Android demasiado rápido en algunos dispositivos con MediaCodec y AudioTrack
  • Android de programación de audio pesadilla - soundpool, audiotrack arrghh?
  • Transmisión de audio MP3 mediante comunicación de socket mediante OpenSL ES en Android
  • Aplicación de ecualizador para Android usando AudioTrack?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.