【发布时间】:2015-03-26 17:01:12
【问题描述】:
我正在尝试在客户端 javascript 上编写麦克风录音,将其传输到服务器,然后将其转换为 Silk。我使用扬声器模块使用这些设置在服务器上播放音频
var speaker = new Speaker({
channels: 1,
bitDepth: 16,
sampleRate: 44000,
signed: true
});
但是当它被转换成丝绸时,它听起来是一半的速度。我相信它使用我没有编写的 C 类转换为丝绸会导致速度变慢,因为它作为 pcm 文件听起来不错。 C文件有这些设置
#define FRAME_LENGTH_MS 20
#define SAMPLE_RATE_KHZ 16
#define SILK_BITRATE 14000
#define FRAME_SAMPLES (FRAME_LENGTH_MS * SAMPLE_RATE_KHZ)
我正在使用 BinaryJS 将代码作为 Int16array 写入服务器。
我会在这里复制代码,但我几乎是从本教程中逐字复制的。
也很想知道我从 audioContext 中得到的比特率、采样率以及如果我必须使用 Silk 编解码器如何降低采样率。
编辑:
我确实(有点)通过修改 onaudioprocess 解决了半速问题,我通过删除一半样本将 float32 转换为 Int16。
l = buffer.length;
point = Math.floor(l/2);
buf = new Int16Array(Math.floor(l/2));
for (var x = l; x > 0;) {
var average = (buffer[x] + buffer[x-1]) / 2;
buf[point] = Math.min(1, average)*0xFFFF;
point -= 1;
x -= 2;
}
return buf.buffer;
但是,音频音高仍然是一半。
【问题讨论】:
-
我认为你的号码应该两边都匹配,所以在发送之前在客户端降低它,这样可以节省带宽......
-
我同意数字需要匹配,但我不相信您可以使用 audioContext 在客户端控制采样率。我也许可以自己对其进行下采样,但我不知道我是否具备这些技能。
标签: javascript node.js websocket pcm audiocontext