热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在JavaScript中对PCM音频缓冲区进行下采样》经验,为你挑选了1个好方法。

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

在11025样本中将float32Array从44100下采样到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;
}

Neablis.. 15

对于任何需要答案的人.

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 

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



1> Neablis..:

对于任何需要答案的人.

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 

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


推荐阅读
author-avatar
沿无际空间
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有