我正在通过网络接收交错的 16 位 PCM 样本。每个样品都有签名
我把它读作 Int16bit 数组,我们称之为 ALL_DATA。所以每个数组条目都是一个 16 位样本。
因为它是交错的,所以我将它提取到 2 个通道 RLRL 中,我最终得到 2 个(16 位)数组,大小是 ALL_DATA 数组的一半。
之后,我检查每个样本并将其规范化为 Float32Array,因为这是 Web 音频 API 使用的。
var normalizedSample= (sample > 0) ? 样本/32768:样本/-32768;
这是正确的方法吗。
我收到失真的声音。你可以知道发生了什么。因此,从字面上看,如果您正在听古典吉他,听起来就像是带有失真的电音。
为了参数的缘故,我放下了示例代码,但这段代码处理
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 数据发送到服务器端之前,我已经将其写入文件,效果很好,声音也很完美。