UNPKG

js-recorder-rtc

Version:
214 lines (208 loc) 7.02 kB
/** * 录音机类 * 支持录制音频并导出为 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; } }