我尝试再次向上和向下采样麦克风音频(用于传输)。但是在这个过程之后音频有点坏了(关闭)。如果您有麦克风,可以自己试试:
FIDDLE: https://jsfiddle.net/q4yjfxqv/10/(已更新21.07.16)
你会听到更高频率的关闭。
我通过删除一半数组
进行缩减采样get()
上传(liniar)
Future
我尝试了其他插值方法,如liniar,cubic和lanczos形式here ......具有相同的快门效果。
快门始终发生在大块边缘。您可以通过在示例中将块大小从1024切换到4096来听到这一点(它会发生更少)。
但为什么呢?任何人都可以解决这个问题以及如何解决?
赞赏任何提示:)
答案 0 :(得分:0)
我不是音频节目专家。
当我得到奇怪的结果(带有一般编程问题)时,我尝试的是改变算法的参数并将其恢复到基础。
当你不下采样时会发生什么?。
即使是最小的错误,音频也非常敏感。 如果缓冲区不够大或何时(使用主线程)处理块播放声音怎么办。
除了在此线程上进行调制之外,您还在进行任何其他处理吗? 那个不同的(HTML5)浏览器怎么样? 目前我无法想到任何其他解决方案或提示。
祝你好运,我希望这会有所帮助。 请发布解决方案,这将有助于其他程序员。答案 1 :(得分:0)
根据您运行的操作系统和计算机,您可能希望增加creatScriptProcessor中指定的缓冲区大小。随着你的尺寸,我听到了文物,但当我把尺寸增加到16384时,我不再听到这些文物了。 (但是现在我听到很长的延迟时间才能听到任何声音,正如大缓冲区大小所预料的那样)。
答案 2 :(得分:0)
当i =(data.length-1)时,你将获得数据[i + 1]的空值 - 所以上采样可能会将最后一个样本平均为零?
(这不是一个很好的下采样 - 因为它首先没有带宽限制 - 但我希望你知道这一点。)
答案 3 :(得分:0)
插值代码的问题是,您不知道下一个块的第一个样本,因此无法正确插入当前样本的最后一个样本。
要解决此问题,您需要保存一个块中的最后一个样本,以计算下一个块的第一个插值样本。
https://jsfiddle.net/hhb240ms/1/
usSample[0] = (lastSample + data[0]) / 2;
usSample[1] = data[0];
for(var i=1;i<512;i++) {
usSample[2*i] = (data[i] + data[i-1]) / 2;
usSample[2*i+1] = data[i]
}
lastSample = data[data.length-1];