android audio bytearray pcm audiotrack

PCM Raw Bytes[] a audio en Android



bytearray audiotrack (2)

La pregunta es si desea reproducir las muestras de PCM que recibe de alguna fuente directamente en la aplicación de Android o si tiene algunos archivos externos que necesita convertir. En el primer caso sigue el camino descrito por jack57. Es realmente fácil e incluso puede agregar marcadores para tener un tiempo preciso.

int bufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM); mAudioTrack.play();

luego llame al método de escritura en un ciclo:

mAudioTrack.write(buffer, 0, buffer.length);

En el segundo caso, use un editor de audio gratuito: http://audacity.sourceforge.net/download/ . Puede almacenar muestras PCM como un archivo .txt, abrirlo en el editor y guardar en el formato que necesite ...

Actualmente tengo un audio PCM en forma de matriz de bytes. El formato está firmado 16 bit little endian. Me gustaría convertir esto a algún formato jugable en el Android, preferiblemente la versión 3.2 o superior. ¿Alguien tiene sugerencias sobre cómo se puede hacer esto? He investigado un poco y he intentado lo siguiente a continuación, pero ninguno tuvo éxito. Sería muy apreciado si alguien pudiera sugerir una mejor manera o indicar dónde me he equivocado.

He intentado crear un AudioFormat con la configuración de audio correcta, sin embargo, Android no es compatible con la biblioteca javax.sound.sampled.

También he intentado escribir los datos PCM en un archivo wave, pero tengo problemas para obtener toda la información de encabezado wav necesaria.

También he intentado usar la clase AudioTrack ofrecida por Android para reproducir los datos PCM. Sin embargo, parece que no puedo escuchar ningún sonido. Aquí está mi método:

public void playback(){ try{ AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 500000, AudioTrack.MODE_STATIC); audioTrack.write(audio, 0, 500000); } catch(Throwable t){ Log.d("Audio","Playback Failed"); } }

Cualquier sugerencia sera apreciada.