PCM Web Audio Api Javascript-я получаю искаженные звуки

Я получаю чередующиеся 16-битные образцы PCM по проводу. Каждый образец подписан

Я читаю его как массив Int16bit, давайте назовем это ALL_DATA. Таким образом, каждая из записей массива является 16-битным образцом.

поскольку он перемежается, я извлекаю его в 2 канала R-L-R-L Я получаю 2 (16 бит) массива размером в половину массива ALL_DATA.

после этого я пойду за каждый образец и нормализовать его Float32Array потому что Web audio API использует.

var normalizedSample= (образец > 0) ? sample / 32768: sample / -32768;

это правильный способ сделать это.

Я получаю искаженные звуки. Вы можете сказать, что происходит. Так буквально, если вы слушаете классическую гитару, это звучит как электрический с искажением.

для Аргументов я помещаю пример кода, но этот код обрабатывает

MONO звук, чтобы сделать пример проще, поэтому нам не нужно перемежайте его также

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, прежде чем отправить его на серверную сторону в файл, это хорошо, и звук идеален.

1 ответов


вместо того чтобы сказать

var normalizedSample= (sample > 0) ? sample / 32768 : sample / -32768;

попробовать

var normalizedSample= sample / 32768;

ваш расчет, как в настоящее время написано, будет инвертировать отрицательные части вашей формы волны, таким образом, как выпрямитель на полную волну (ваши образцы всегда будут положительными числами).

enter image description here