2012-01-03 12 views
7

Hola, estoy trabajando en la API de WebAudio. Leo el enlace HTML5 Web Audio API, porting from javax.sound and getting distortion pero no obtengo una buena calidad como en la API java. Obtengo datos PCM del servidor en bytes firmados. Entonces tengo que cambiar esto en formato de 16 bits. para cambiar lo estoy usando (firstbyte < < 8 | secondbyte) pero no puedo obtener buena calidad de sonido. ¿Hay algún problema en la conversión o en cualquier otra forma de obtener buena calidad de sonido?reproducir datos pcm por web API de audio

+1

Los fragmentos de código siempre son útiles. – ebidel

+0

¿alguien puede decirme cómo convertir una matriz de bytes firmada a Float32Array? – user894554

+0

No demasiado orgulloso para votar esto, pero esta es una buena pregunta, ya que la documentación oficial se salta la parte PCM del juego, que sería la función directa, y se enfoca en decodeAudioData(), que es más un 'ayudante'. –

Respuesta

4

La API de Web Audio utiliza flotantes con signo de 32 bits de -1 a 1, así que eso es lo que voy a mostrar (con suerte) cómo hacerlo, en lugar de 16 bits como mencionó en la pregunta.

Asumiendo que su conjunto de muestras se llama samples y se almacenan como complemento de 2 desde -128 y 127, creo que esto debería funcionar:

var floats = new Float32Array(samples.length); 
samples.forEach(function(sample, i) { 
    floats[i] = sample < 0 ? sample/0x80 : sample/0x7F; 
}); 

entonces usted puede hacer algo como esto:

var ac = new webkitAudioContext() 
    , ab = ac.createBuffer(1, floats.length, ac.sampleRate) 
    , bs = ac.createBufferSource(); 
ab.getChannelData(0).set(floats); 
bs.buffer = ab; 
bs.connect(ac.destination); 
bs.start(0); 
+0

Creo que te estás perdiendo "bs.buffer = ab;" – CpnCrunch

Cuestiones relacionadas