2011-06-04 13 views
5

Estoy leyendo un archivo de audio .wav usando Java AudioInputStream. El archivo de audio está firmado por PCM de 16 bits, con samplerate = 44100, framesize = 2, framelength = 114048. Logré obtener los datos de audio en forma de una matriz de bytes, pero no estoy seguro de cuánto tamaño debería asignar a esta matriz de bytes para poder convertirlos a valores de punto flotante. Estoy haciendo algo de manipulación de audio usando el algoritmo de Goertzel que toma la entrada de la matriz flotante, algo así como "float [] x". A continuación se muestra un fragmento de código que estoy usando. Gracias por adelantado.Convertir matriz de bytes de formato de audio wav al punto flotante

try { 
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn); 
    } 

while (numBytesRead != -1) { 
numBytesRead = audioInputStream.read(audioBytes); 

// Logic goes here 
floatValue = byteArrayToFloat(audioBytes); 
} 

Respuesta

9

El archivo de audio es de 16 bits PCM firmado, con samplerate = 44100, FrameSize = 2, framelength = 114048.

Asumo de lo anterior que es suficiente con una sola canal (muestras de 2 bytes * 1 canal = 2 cuadros de bytes).

El primer paso es obtener los datos como una secuencia de un tipo integral de 16 bits, que es short en Java.

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.ShortBuffer; 

... 

byte[] audioBytes = ... 

ShortBuffer sbuf = 
    ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); 
short[] audioShorts = new short[sbuf.capacity()]; 
sbuf.get(audioShorts); 

Ahora cómo convertir eso a float s depende de cómo funciona aguas abajo esperan que el audio a ser representado. Por ejemplo si esperan que los números de coma flotante> = -1 y < = 1, entonces usted puede hacer esto:

float[] audioFloats = new float[audioShorts.length]; 
for (int i = 0; i < audioShorts.length; i++) { 
    audioFloats[i] = ((float)audioShorts[i])/0x8000; 
} 

Por desgracia hay un montón de maneras de representar audio.

+1

¿Es correcto que su código de ejemplo asuma que AudioInputStream es little-endian? Si no puede confiar en esa suposición, ¿es seguro llamar a .getFormat(). IsBigEndian(), y si devuelve true, pasar en ByteOrder.BIG_ENDIAN en su lugar? – rlkw1024

Cuestiones relacionadas