gpt4 book ai didi

javascript - PCM Web Audio Api Javascript - 我的声音失真

转载 作者:数据小太阳 更新时间:2023-10-29 04:03:44 26 4
gpt4 key购买 nike

我正在通过线路接收交错的 16 位 PCM 样本。每个样本都有签名

我将其读取为 Int16 位数组,我们称其为 ALL_DATA。所以每个数组条目都是一个 16 位样本。

因为它是交错的,所以我将它提取到 2 个 channel R-L-R-L我最终得到 2 个(16 位)数组,大小是 ALL_DATA 数组的一半。

之后,我遍历每个样本并将其标准化为 Float32Array,因为这就是网络音频 API 使用。

var normalizedSample= (样本 > 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;

};

任何可能导致声音失真的建议都会有所帮助。在将 pcm 数据发送到服务器端之前,我已经将其写入文件,并且声音很好。

最佳答案

而不是说

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

尝试

var normalizedSample= sample / 32768;

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

enter image description here

关于javascript - PCM Web Audio Api Javascript - 我的声音失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16925884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com