Reproduce 2 flujos de audio diferentes en el altavoz izquierdo y derecho

Algunas circunstancias especiales me obligan a hacer esa cosa pervertida.

¿Es posible reproducir 2 flujos de audio diferentes en diferentes canales. Imagine un auricular y necesito tocar la primera canción en el altavoz izquierdo y la segunda canción en el altavoz derecho simultáneamente.

Después de algunas investigaciones encontré que es posible tocar en un solo canal. Es posible incluso cerrar uno de ellos. Pero no encontré ninguna información sobre cómo reproducir 2 secuencias de audio simultáneamente.

¿Es posible? ¿Y cómo? Algunos ejemplos de código y enlaces apreciados!


Resultados de la investigacion.

1) AudioTrack capaz de reproducir en diferentes canales

 // only play sound on left for(int i = 0; i < count; i += 2){ short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF); samples[i + 0] = sample; samples[i + 1] = 0; } // only play sound on right for(int i = 0; i < count; i += 2){ short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF); samples[i + 0] = 0; samples[i + 1] = sample; } 

2) SoundPool puede ajustar el volumen para los canales izquierdo y derecho por separado. Tan técnicamente es posible comenzar 2 corrientes y fijar para un volumen izquierdo 0 y 100 para el volumen derecho y viceversa para la 2da corriente. ¿Derecha?

 setVolume(int streamID, float leftVolume, float rightVolume) 

muestra:

  SoundPool pool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0); pool.play( pool.load(this, R.raw.my_sound_effect, 1), // The sound effect to play 0, // The volume for the left channel (0.0 - 1.0) 1.0f, // The volume for the right channel (0.0 - 1.0) 0, // Default priority 0, // Do not loop 1.0f); // Playback rate (1.0f == normal) 

Perhabs hay tal solución con MediaPlayer para que sería mucho más preferible!


SOLUCIÓN : Parece que la solución más fácil es usar SoundPool . La forma en que lo probé.

 //SDK Version public CustomSoundPool() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { AudioAttributes attributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_GAME) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .build(); soundPool = new SoundPool.Builder() .setAudioAttributes(attributes) .build(); } else { soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); } soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { soundPool.play(sampleId, 1.0f, 0, 0, 0, 1.0f); //left channel //soundPool.play(sampleId, 0, 1.0f, 0, 0, 1.0f); //right channel } }); } public void playSound(String path) { if (soundPool != null) { soundPool.load(path, 1); } } public void release(){ if (soundPool != null) { soundPool.release(); } } 

Aunque no hay características como MediaPlayer.OnCompletionListener() . Ahora seguro de cómo implementar esto, pero de todos modos .. Problema resuelto.

Cualquiera de los enfoques 1) 2) debe funcionar como usted ha dicho.

En cuanto al enfoque 1), si desea reproducir diferentes secuencias simultáneamente, podría escribir ambos canales con diferentes datos en el mismo bucle, sin usar dos bucles. Para ajustar el volumen por canal , puede utilizar el método de AudioTrack setStereoVolume(float leftGain, float rightGain) .

Dado que MediaPlayer es una API de alto nivel, no ofrece este nivel de especificidad; Una solución podría ser guardar los datos de audio en un archivo (silenciar el canal izquierdo / derecho) y reproducirlo como un elemento de medios regular usando MediaPlayer .


ACTUALIZAR:

Guardar los datos de audio en un archivo (silenciamiento del canal izquierdo / derecho)

Para hacer esto, suponiendo que tiene sus datos de audio en el formato compatible con AudioTrack (PCM), sólo tiene que procesar los datos como dijo (silenciar un canal restableciendo parte de la matriz) y luego guardar la matriz / Un archivo como WAV / PCM. Echa un vistazo aquí para obtener más detalles y código sobre cómo guardar archivos WAV.

  • No se puede establecer el sonido de notificación push en android
  • Android proceso de audio para sintonizador de guitarra
  • Android: Encontrando audio y video usando MediaCodec
  • ¿Cómo puedo detener GC_CONCURRENT corriendo tan frecuentemente?
  • Los archivos mp3 de baja calidad no se reproducen correctamente como se esperaba
  • Reproducir sonido en las notificaciones de Android, aunque el modo de silencio del teléfono se establece
  • Cómo obtener una lista de reproductores multimedia instalados
  • Convertir PCM-16 a AMR usando AmrInputStream
  • Reproducción de audio desde URI Dentro de ListView, pero Seekbar no se está actualizando en el elemento ListView de Android
  • No se puede acceder a AudioRecorder
  • La reproducción de una canción tras otra provoca un error en MP3Extractor
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.