2016-08-12 5 views
1

Mon application transmet les données binaires PCM du serveur à l'API Web Audio.Pourquoi mon code de diffusion audio JS est-il différent sur les systèmes x86 et x86_64?

Pour normaliser l'audio, j'utilise un DataView pour lancer les données entrantes à Int16, diviser chaque échantillon par 32768, avant de les jeter retour à Float32 pour la lecture:

var data = new DataView(arrayBuffer); 

var tempArray = new Int16Array(data.byteLength/Int16Array.BYTES_PER_ELEMENT); 

var len = tempArray.length; 
for (var jj = 0; jj < len; ++jj) { 
    tempArray[jj] = data.getInt16(jj * Int16Array.BYTES_PER_ELEMENT, true); 
} 


var bufferToPlay = new Float32Array(tempArray.length); 
var channelCounter = 0; 
for (var i = 0; i < tempArray.length;) { 
    var normalizedAudio = tempArray[i]/32768; 
    i = i + 1; 
    bufferToPlay[channelCounter] = normalizedAudio; 
    channelCounter++; 
} 

Voici les bizarreries:

Lorsque je l'exécute sur ma machine Win 64 bits, l'audio est irréprochable. Mais quand j'utilise mon ancienne machine Win XP 32 bits, l'audio est plein de ce qui ressemble à des artefacts de rééchantillonnage/conversion de bits. J'ai lu beaucoup de choses sur l'endianness, mais les deux machines sont Pentium, alors les deux devraient être little-endian, n'est-ce pas? Alors, comment est-ce possible?

Répondre

1

Vérifiez sampleRate pour le contexte WebAudio sur chaque machine. Sont-ils les mêmes? De plus, si l'endianness était faux, cela ne ressemblerait pas à un rééchantillonnage/conversion de bits. Si cela ressemble à un rééchantillonnage, les fréquences d'échantillonnage pour les deux machines sont très probablement différentes.

+0

Merci de votre participation. Il s'avère que c'était un décalage de taux d'échantillonnage de carte son. – user3174541