You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改recorder.js录制位深:从16位改为24位(采样率44100Hz)

调整Recorder.js录制参数为44100Hz/24位的方法

完全可以通过添加配置项的方式实现参数修改,具体分两步操作:

1. 修改Worker初始化代码,传入位深度配置

在初始化Worker的init命令中,新增bitDepth配置项并设置为24,修改后的代码如下:

var worker = new Worker(config.workerPath || WORKER_PATH);
worker.postMessage({
    command: 'init',
    config: {
        sampleRate: this.context.sampleRate,
        bitDepth: 24 // 新增24位深度配置
    }
});

2. 调整Worker内部的音频数据处理逻辑

默认的Recorder.js Worker只支持16位音频输出,需要修改Worker脚本中的核心处理逻辑,适配24位格式:

核心修改点:

  • 在Worker初始化阶段,保存传入的bitDepth配置
  • 在导出音频数据(如WAV格式)时,将32位浮点样本转为对应位深度的整数,并写入正确的字节数

修改后的Worker关键代码示例:

var recLength = 0,
    recBuffers = [],
    sampleRate,
    bitDepth; // 新增位深度变量

self.onmessage = function(e){
    switch(e.data.command){
        case 'init':
            init(e.data.config);
            break;
        // 保留record、clear等原有命令逻辑
    }
};

function init(config){
    sampleRate = config.sampleRate;
    bitDepth = config.bitDepth || 16; // 读取配置,默认16位
}

// 修改exportWAV函数中的编码逻辑
function exportWAV(type){
    var bufferL = mergeBuffers(recBuffers[0], recLength);
    var bufferR = mergeBuffers(recBuffers[1], recLength);
    var interleaved = interleave(bufferL, bufferR);
    var dataview = encodeWAV(interleaved);
    var audioBlob = new Blob([dataview], { type: type });

    self.postMessage(audioBlob);
}

function encodeWAV(samples){
    var bytePerSample = bitDepth / 8;
    var buffer = new ArrayBuffer(44 + samples.length * bytePerSample);
    var view = new DataView(buffer);

    // 写入WAV文件头核心字段(仅修改位深度相关部分)
    view.setUint16(22, bitDepth); // 替换原固定值16
    view.setUint32(32, samples.length * bytePerSample); // 更新数据块大小
    view.setUint32(40, samples.length * bytePerSample); // 更新文件总大小

    // 样本转换与写入
    var offset = 44;
    var scaleFactor = Math.pow(2, bitDepth - 1) - 1;
    for(var i = 0; i < samples.length; i++){
        var sample = samples[i] * scaleFactor;
        if(bitDepth === 24){
            // 24位样本占3字节,小端字节序写入
            view.setUint8(offset++, sample & 0xff);
            view.setUint8(offset++, (sample >> 8) & 0xff);
            view.setUint8(offset++, (sample >> 16) & 0xff);
        } else {
            // 保留原有16位处理逻辑
            view.setInt16(offset, sample, true);
            offset += 2;
        }
    }

    return view;
}

说明:

  • 24位音频每个样本占用3字节,需同步修改WAV文件头中BitsPerSample、Subchunk2Size等字段
  • 样本转换时需匹配24位的幅值范围(-8388608 ~ 8388607),确保音频动态范围正确
  • 字节序采用和16位一致的小端模式,保证兼容性

内容的提问来源于stack exchange,提问作者Grumpy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:27:08