我通过线路接收交错的16位PCM样本。每个样本都签名
我把它读作Int16bit数组,让我们调用这个ALL_DATA。因此每个数组条目都是一个16位样本。
因为它是交错的,所以我把它提取到2个通道R-L-R-L中 我最终得到的是两个(16位)数组,大小是ALL_DATA数组的一半。
之后我会检查每个样本并将其标准化为Float32Array,因为那就是 网络音频API使用。
var normalizedSample =(样本> 0)? sample / 32768:sample / -32768;
这是正确的做法吗?
我听到了扭曲的声音。你可以知道发生了什么。所以,如果你正在聆听经典吉他,那么听起来就像是电动的失真。
对于Arguments,我正在放下示例代码,但此代码处理
MONO SOUND使示例更简单,因此我们也不必交错它
var startTime = 0;
var fileReader = new FileReader();
fileReader.onload = function (e) {
var data = new DataView(e.target.result);
var audio = new Int16Array(data.byteLength / Int16Array.BYTES_PER_ELEMENT);
var len = audio.length;
for (var jj = 0; jj < len; ++jj) {
audio[jj] = data.getInt16(jj * Int16Array.BYTES_PER_ELEMENT, true);
}
var right = new Float32Array(audio.length);
var channleCounter = 0;
for (var i = 0; i < audio.length; ) {
var normalizedRight = (audio[i] > 0) ? audio[i] / 32768 : audio[i] / -32768;
i = i + 1;
right[channleCounter] = normalizedRight;
channleCounter++;
}
var source = audioContext.createBufferSource();
var audioBuffer = audioContext.createBuffer(1, right.length, 44100);
audioBuffer.getChannelData(0).set(right);
source.buffer = audioBuffer;
source.connect(audioContext.destination);
source.noteOn(startTime);
startTime += audioBuffer.duration;
};
任何可能导致失真声音的建议都会有所帮助。我在将服务器端发送到文件之前写了pcm数据是好的,声音很完美。
答案 0 :(得分:17)
而不是说
var normalizedSample= (sample > 0) ? sample / 32768 : sample / -32768;
试
var normalizedSample= sample / 32768;
您的计算,如当前所写,将以类似于全波整流器的方式反转波形的负部分(您的样本将始终为正数)。