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.
- Conversión de frames a milisegundos en android
- No se puede recuperar el puntero AudioTrack para write ()
- Android AudioTrack no reproduce todas las muestras
- Error SoundPool: no hay más nombres de pista disponibles
- Uso de un búfer con Android 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 }
- AudioTrack: play () llamado en AudioTrack no inicializado
- SoundPool "AudioFlinger no pudo crear pista, estado: -12"
- Cómo convertir archivos .pcm a .wav o .mp3?
- ¿Cómo obtengo un InputStream para una canción comprada en la tienda de GooglePlay?
- AudioTrack Android reproduce sonidos de la carpeta raw
- Android MediaCodec no decodificar todos los búferes de entrada
- Emitir codificación y decodificación de una grabación de audio al formato G711 (PCMU - uLaw)
- AudioTrack - ¿Cómo saber cuándo empieza o termina un sonido?
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); }
- Manipulación de pesos en onMeasue para vistas personalizadas
- GetBuyIntent devuelve la facturación en la aplicación de la versión 3 de la API nula