javascript - 在javascript中对PCM音频缓冲区进行下采样

标签 javascript html node.js audio webkitaudiocontext

我正在尝试对从 audioContext 获得的采样率进行下采样。我相信它会在 44100 进入,我希望它是 11025。我想我可以平均每 3 个样本并且它以正确的速率播放,但是音调太高了,好像我们都在氦气上.

将 float32Array 从 44100 下采样到 11025 个样本的 int16Array 的正确方法是什么。

var context = new Flash.audioContext();
var audioInput = context.createMediaStreamSource(stream);
var recorder = context.createScriptProcessor(null, 1, 1);
recorder.onaudioprocess = onAudio;
audioInput.connect(recorder);
recorder.connect(context.destination);

var onAudio = function (e) {
    var left = e.inputBuffer.getChannelData(0);
    bStream.write(Flash.convertFloat32ToInt16(left));
}

var convertFloat32ToInt16 = function(buffer) {
    var l = buffer.length;
    var point = Math.floor(l/3);
    var buf = new Int16Array(point);
    for (var x = l; x > 0;) {
        var average = (buffer[x] + buffer[x-1] +  buffer[x-2]) / 3;
        buf[point] = average*0x7FFF;
        point -= 1;
        x -= 3;
    }
    return buf.buffer;
}

最佳答案

对于任何其他需要答案的人。

var downsampleBuffer = function (buffer, sampleRate, outSampleRate) {
    if (outSampleRate == sampleRate) {
        return buffer;
    }
    if (outSampleRate > sampleRate) {
        throw "downsampling rate show be smaller than original sample rate";
    }
    var sampleRateRatio = sampleRate / outSampleRate;
    var newLength = Math.round(buffer.length / sampleRateRatio);
    var result = new Int16Array(newLength);
    var offsetResult = 0;
    var offsetBuffer = 0;
    while (offsetResult < result.length) {
        var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
        var accum = 0, count = 0;
        for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {
            accum += buffer[i];
            count++;
        }

        result[offsetResult] = Math.min(1, accum / count)*0x7FFF;
        offsetResult++;
        offsetBuffer = nextOffsetBuffer;
    }
    return result.buffer;
}

这将返回一个小于传递给它的采样率,同时还将其转换为 int16Array 而不是 float32。

关于javascript - 在javascript中对PCM音频缓冲区进行下采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28227380/

相关文章:

html - 如何在表格上设置边框

html - 使用 Xpath 提取 html 标签的全部内容

mysql - 为什么mysql会抛出语法错误

jquery - 创建额外的标签

node.js - Redis 无法连接 env 端口

javascript - 如何使用 Node.js 正确提供私有(private)静态文件?

javascript - 在 Ionic 2 中,如何创建使用 Ionic 组件的自定义指令?

javascript - JQuery 函数绑定(bind)到 body 节点的单击事件,并立即执行另一个单击事件

java - 在网页上以良好的图形可视化用 Java 编写的图形数据结构的最佳方法是什么?

javascript - 引导混合 Angular 1+2 应用程序