如何修改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
相关产品推荐
相关产品推荐

