【发布时间】:2013-06-13 20:09:13
【问题描述】:
您好,我在客户端缓冲了一组 PCM 数据 (Float32) (所有这些音频阵列都是同一首歌的一部分) 所以它是一种 PCM 数据的客户端缓冲。 从服务器下载 N 个数组后,我开始播放这些缓冲区并调用下面的函数来播放示例数组。
var AudioStart =0;
function playPcmChunk(data){
var source = audioContext.createBufferSource();
var audio=new Float32Array(data);
var audioBuffer = audioContext.createBuffer(1, audio.length , 44100);
audioBuffer.getChannelData(0).set(audio);
source.buffer = audioBuffer;
source.start(AudioStart);
AudioStart += audioBuffer.duration;
}
在每个样本之间我都会获得点击。
现在,为了确保我查看了服务器端的数据,它在 Audacity 中运行良好且流畅。
然后为了调试,我逐字打印出这些值,并在客户端和服务器端进行比较,看看是否存在传输问题,它们是否相同。
那么为什么我会在缓冲的样本数组之间听到点击声音。
我对确切时间的计算不正确吗?这是一个已知的网络音频 api 问题吗?
我认为这是尽可能精确的。我是否需要应用过滤器来消除点击。该过滤器的名称是什么?即使有我认为那将是黑客攻击。
欢迎提出意见
编辑:
这是我读取 websocket 并将 30 个(这完全是一个随机数)这些样本存储在一个数组中的地方。 在存储了 30 个之后,我开始循环每个样本并调用 playPcmChunk 并丢弃其余的音频。(这是用于测试)
每个都是 44100 32bitFloat,单声道。
wsAudio.onmessage = function (messageEvent) {
if (messageEvent.data instanceof Blob) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
if (currentCount == -1) {
return;
}
if (currentCount < 30) {
audioChunks[currentCount] = e.target.result;
currentCount++;
} else {
for (var j = 0; j < 30; j++) {
playPcmChunk(audioChunks[j]);
}
currentCount = -1;
}
};
fileReader.readAsArrayBuffer(messageEvent.data);
}
}
【问题讨论】:
-
需要查看调用 playPcmChunk 的代码。
标签: javascript scheduling web-audio-api pcm