PCM Web Audio Api Javascript - 我听到了扭曲的声音

Evr*_*gøl 8 javascript pcm typed-arrays web-audio-api

我通过线路接收交错的16位PCM采样.每个样本都已签名

我把它读作Int16bit数组,让我们调用这个ALL_DATA.因此每个数组条目都是16位样本.

因为它是交错的,所以我把它提取到2个通道中RLRL我最终得到了一半大小为ALL_DATA数组的2(16位)数组.

之后,我查看每个示例并将其规范化为Float32Array,因为这是Web音频API使用的.

var normalizedSample =(sample> 0)?sample/32768:sample/-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;

                };
Run Code Online (Sandbox Code Playgroud)

任何可能导致失真声音的建议都会有所帮助.我在将服务器端发送到文件之前写了pcm数据是好的,声音很完美.

Rob*_*vey 16

而不是说

var normalizedSample= (sample > 0) ? sample / 32768 : sample / -32768;
Run Code Online (Sandbox Code Playgroud)

尝试

var normalizedSample= sample / 32768;
Run Code Online (Sandbox Code Playgroud)

您的计算,如当前所写,将以类似于全波整流器的方式反转波形的负部分(您的样本将始终为正数).

在此输入图像描述