js-recorder-rtc
Version:
214 lines (208 loc) • 7.02 kB
TypeScript
/**
* 录音机类
* 支持录制音频并导出为 PCM 或 WAV 格式
* 支持配置采样率、采样位数、声道数等参数
*/
export declare class Recorder {
/**
* 录音配置参数:采样率、采样位数、声道数、缓冲区大小
* @private
*/
private readonly config;
/**
* Web Audio API 音频上下文
* @private
*/
private audioContext;
/**
* 媒体流对象,表示从麦克风获取的音频流
* @private
*/
private stream;
/**
* AudioWorkletNode 或 ScriptProcessorNode 节点
* @private
*/
private recorderNode;
/**
* 存储录音的音频数据数组,存储左声道和右声道
* @private
*/
private audioData;
/**
* 实际使用的采样率,可能与请求的采样率不同。
* 浏览器可能会调整实际采样率以适应设备。(这个是设备决定的)
* @private
*/
private actualSampleRate;
/**
* 当前录音状态 未激活/录音中/已暂停
* @private
*/
private status;
/**
* 实时 PCM 数据回调函数
* @private
*/
private onPCMDataCallback;
/**
* 初始化录音器的配置和状态。
* @param options - 录音配置选项
*/
constructor(options?: RecorderConfig);
/**
* 验证录音配置参数是否有效。
* 检查采样位数、声道数和采样率是否在允许范围内。
* @throws {Error} 当参数无效时抛出错误
* @private
*/
private validateConfig;
/**
* 获取当前录音状态
* @returns {RecorderStatus} 当前状态
*/
getStatus(): RecorderStatus;
/**
* 初始化录音功能
* 请求麦克风权限,并设置音频处理节点(AudioWorkletNode 或 ScriptProcessorNode)。
* @throws {Error} 初始化失败时抛出错误
*/
init(): Promise<void>;
/**
* 设置 ScriptProcessorNode
* ScriptProcessorNode 是 Web Audio API 提供的用于处理音频数据的节点,但已被弃用,推荐使用 AudioWorklet。
* @param source - 音频源节点
* @private
*/
private setupScriptProcessorNode;
/**
* 处理来自 AudioWorklet 的消息
* 将音频数据保存到 audioData 数组中
* @param event - 消息事件对象
* @private
*/
private handleWorkletMessage;
/**
* 处理来自 ScriptProcessorNode 的音频数据
* 将接收到的音频数据保存到 audioData 数组中,并进行重采样处理。
* @param event - 音频处理事件对象
* @private
*/
private handleScriptProcessorProcess;
/**
* 开始录音
* 如果当前状态不是录音中,则清空已有的音频数据,设置状态为录音中,并开始录音。
*/
start(): void;
/**
* 暂停录音
* 如果当前状态是录音中,则设置状态为暂停,并暂停录音。
*/
pause(): void;
/**
* 恢复录音
* 如果当前状态是暂停,则设置状态为录音中,并恢复录音。
*/
resume(): void;
/**
* 停止录音
* 设置状态为非活动状态,停止所有音频轨道,断开音频节点连接,关闭音频上下文。
*/
stop(): void;
/**
* 设置实时 PCM 数据的回调函数。
* 当有新的 PCM 数据时,会调用该回调函数。
* @param callback - 接收 PCM 数据的回调函数
*/
setPCMDataCallback(callback: (pcmData: Float32Array) => void): void;
/**
* 导出 PCM 数据
* @returns { Uint8Array | int16Array} PCM 格式的音频数据
*/
exportPCM(): Uint8Array | Int16Array;
/**
* 重采样可以异步可以同步并且有多种算法
* 线性插值:简单且计算量小,但在某些情况下可能导致音质下降或失真。
* 高阶插值(如立方插值):提供更平滑的结果,音质更高,但计算量较大。
* 窗函数法(如 FIR 滤波器):能够有效减少混叠和频谱泄漏,适合高质量音频处理。
* 多相滤波器:适用于高效的多倍频率转换,常用于专业音频处理。
* 这里使用线性插值进行同步重采样
* @param inputData - 输入的 Float32Array 音频数据
* @param inputSampleRate - 输入采样率
* @param outputSampleRate - 输出采样率
* @returns {Float32Array} 重采样后的音频数据
* @private
*/
private resampleSync;
/**
* 合并音频数据。
* 将所有录音片段合并为一个连续的 Float32Array。
* @returns {Float32Array} 合并后的音频数据
* @private
*/
private mergeAudioData;
/**
* 合并多个 Float32Array 为一个
* @param arrays - 需要合并的 Float32Array 数组
* @returns {Float32Array} 合并后的 Float32Array
* @private
*/
private mergeFloat32Arrays;
/**
* 交错多个声道的数据 交换逻辑 L1 R1 L2 R2
* @param channelsData - 每个声道的 Float32Array
* @returns {Float32Array} 交错后的音频数据
* @private
*/
private interleaveChannels;
/**
* 导出 WAV 格式音频文件。
* 先导出 PCM 数据,然后将其封装为 WAV 格式的 Blob 对象。
* @returns {Blob} WAV 格式的 Blob 对象
* @throws {Error} 如果录音正在进行中,抛出错误
*/
exportWAV(): Blob;
/**
* 创建 WAV 文件。
* 根据 PCM 数据和录音配置,生成包含 WAV 头部信息的 ArrayBuffer。
* WAV 文件包含 RIFF 头、fmt 子块和 data 子块。
* @param pcmData - PCM 音频数据,可以是 Uint8Array 或 Int16Array
* @returns {ArrayBuffer} 包含 WAV 头部信息的音频数据
* @private
*/
private createWavFile;
/**
* 将字符串写入 DataView
* 用于在 WAV 文件头部写入标识符,如 "RIFF"、"WAVE" 等。
* @param view - DataView 对象
* @param offset - 写入位置的偏移量
* @param string - 要写入的字符串
* @private
*/
private writeString;
}
/**
* 录音配置接口
* 定义录音器所需的所有可配置参数
*/
export declare interface RecorderConfig {
sampleRate?: number;
sampleBits?: 8 | 16;
channels?: 1 | 2;
bufferSize?: number;
}
/**
* 录音状态枚举
* 用于跟踪录音器当前的工作状态
*/
export declare enum RecorderStatus {
INACTIVE = "inactive",// 未激活/已停止
RECORDING = "recording",// 录音中
PAUSED = "paused"
}
export { }
declare global {
interface AudioWorkletGlobalScope {
registerProcessor(name: string, processorCtor: typeof RecorderProcessor): void;
}
}