@echogarden/audio-io

中文文档
0.4.2发布于 2025/05/17MITTypeScriptES Module近 30 天下载 1.4万

通过平台专用API提供低等音频I/O. 包括所有支持的平台的预编译附加.

中文使用文档
文档目录7 节
  1. 安装
  2. 低级音频输出
  3. 高级别回放方法
  4. 盖起外加
  5. 还是实验性的,需要反馈
  6. 未来
  7. 许可证

回声园音频 I/ 欧

一个提供低级音频输出的节点.js软件包(音频输入尚未执行用于各种平台的常见音频API:

代码非常简陋,不依赖任何外文库,只有直接的系统调用.

每个平台都有一个独立 cpp 源文件,它使用Node Addon API(C++)生成一个与给定平台的Node.js运行时间相融合的Node.js addon.

增量作为 仅预编译二进制,这意味着软件包不需要安装任何构建时间后处理.

安装

npm install @echogarden/audio-io

低级音频输出

此示例使用 createAudioOutput,并使用回调直接写入音频设备输出缓冲器。 在需要直接、实时控制或进行低频音频处理的情况下,这是有用的.

如果您更有兴趣播放一个已有的音频文件,或音频缓冲器,可以跳过这个,移动到下面的高级操作部分.

// Import module
import { createAudioOutput } from '@echogarden/audio-io'

// Define an audio output handler function
function audioOutputHandler(outputBuffer: Int16Array) {
    // Write 16-bit signed integer little-endian samples to `outputBuffer`.
    // If there are multiple channels, interleave them, like `LRLRLRLR..` for stereo.
}

// Create audio output, passing a configuration object and the handler
const audioOutput = await createAudioOutput({
    sampleRate: 44100, // Sample rate in Hz, should be an integer like 44100, 22050, 8000
    channelCount: 2, // Channel count, likely 1 (mono), or 2 (stereo)
    bufferDuration: 100.0, // Target audio output buffer duration, in milliseconds. Defaults to 100.0
}, audioOutputHandler)

// ...

// When done, call audioOutput.dispose(),
// which will close the audio output and free any associated memory or handles.
await audioOutput.dispose()

页:1数字 :

  • 目前只支持了16位,已签名的整数,小端,相接的缓冲. 确保音频数据在写入处理器缓冲器前转换为此格式

说明 bufferDuration数字 :

  • 在 MME (Windows) 和 ALSA (Linux) 上 bufferDuration 用于直接计算输出缓冲大小
  • 在 Core Audio (macOS) 上,它将用于设置最大缓冲大小, 但驱动程序选择的实际缓冲大小可能要小得多

高级别回放方法

这些方法包围 createAudioOutput 并会在内部创建新的音频输出,播放给定的音频数据,然后处理音频输出.

playWaveData(waveData: Uint8Array, options?: PlaybackOptions, positionCallback?: PositionCallback)

播放 WAVE 格式字节, 给定为 Uint8Array数字 :

// Import modules
import { readFile } from 'fs/promises`'
import { playWaveData } from '@echogarden/audio-io'

const waveData: Uint8Array = await readFile('test.wav')

await playWaveData(waveData, { bufferDuration: 125 }) // 125ms buffer duration

positionCallback 参数接受一个在播放音频时会反复调用的回调,并带有样本精确回放位置数据. 例如:

await playWaveData(waveData, {}, (callbackData) => {
    console.log(`Current audio time position: ${callbackData.timePosition}`)
    console.log(`Current sample offset: ${callbackData.sampleOffset}`)
})

positionCallback 还被以下所有回放方法所接受.

如果您想要独立使用下方的 WAVE 编码器/解码器, 您可以导入 @echogarden/wave-codec 直接将软件包放入您的工程中,参见 其文档 更多细节.

playFloat32Channels(float32Channels: Float32Array[], sampleRate: number, options?: PlaybackOptions, positionCallback?: PositionCallback)

播放浮点样本,作为数组 Float32Array中,每个 Float32Array 是一个单独的频道 :

// Import module
import { playFloat32Channels } from '@echogarden/audio-io'

const float32Channels: Float32Array[] = //... retrieve audio samples

await playFloat32Channels(float32Channels, 44100) // 44100 Hz, default buffer duration

playInt16Samples(int16Samples: Int16Array, sampleRate: number, channelCount: number, options?: PlaybackOptions, positionCallback?: PositionCallback)

游戏签名, 16- bit interleaved, PCM 音频样本, 给定为 Int16Array数字 :

// Import module
import { playInt16Samples } from '@echogarden/audio-io'

const int16Samples: Int16Array = //... retrieve audio samples

await playInt16Samples(int16Samples, 44100, 2) // 44100 Hz, 2 channels, default buffer duration

playTestTone(options?: TestToneOptions, positionCallback?: PositionCallback)

播放立体声测试音调(sine wave),以测试音频输出是否工作正确.

import { playTestTone } from '@echogarden/audio-io'

await playTestTone({
    totalDuration: 1,
    sampleRate: 48000,
    bufferDuration: 100,
    frequencyLeft: 440,
    frequencyRight: 280,
})

盖起外加

为所有支持的平台捆绑了预建的附加物.

要重建他们自己,看 用于构建附加物的指南。 。 。 .

还是实验性的,需要反馈

所有代码都是从零开始写的,意味着它还没有在众多的系统上进行测试:

  • Windows 添加器只在 Windows 11 上测试过
  • Linux addon只在WSL2(Ubuntu 24.04)和VirtualBox(仅x64)的一款Ubuntu 23.10 VM中测试过
  • macOS addon 仅在VMWare的 macOS 13 VM 中测试过(只有x64)

如果你遇到任何碰撞,出乎意料的错误,或音频问题,如扭曲或文物,它们可能比较容易解决. 开个问题告诉我.

未来

  • 音频投入 一旦音频产出得到足够稳定和测试,将实施
  • 列表和选择音频输出设备的选项, 并使用默认设备以外的播放设备
  • 通过检测输出设备属性,更好地处理多通道音频(超过2个频道). 如果默认输出设备不支持给定的频道数, 它会出错
  • 通过 Windows 添加可选的下等潜伏 I/O 瓦萨皮 API( 支持于 Windows Vista 或更新)

许可证

麻省理工学院

版本与发布记录

@echogarden/audio-io 共发布 15 个版本,首次发布于 2024/10/25;过去 12 个月发布了 0 个版本。

版本发布日期距今
0.4.2latest2025/05/171.5 年前
0.4.12025/05/111.5 年前
0.4.02025/05/061.5 年前
0.3.02024/12/131.9 年前
0.2.32024/11/052 年前
0.2.22024/11/032 年前

关于 @echogarden/audio-io 的常见问题

@echogarden/audio-io 是什么?

通过平台专用API提供低等音频I/O. 包括所有支持的平台的预编译附加.

如何安装 @echogarden/audio-io?

在项目目录运行 npm install @echogarden/audio-io,或使用 pnpm add / yarn add / bun add。

@echogarden/audio-io 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@echogarden/audio-io 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@echogarden/audio-io 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@echogarden/audio-io 可以商用吗?

@echogarden/audio-io 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@echogarden/audio-io 的下载量有多少?

根据 npm 官方下载统计,@echogarden/audio-io 在 2026/10/13 – 2026/11/11 这 30 天内被下载 13,576 次,日均约 453 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@echogarden/audio-io 还在维护吗?

最新版本 0.4.2 发布于 2025/05/17(1.5 年前);至今共发布 15 个版本,其中过去 12 个月发布了 0 个;首次发布于 2024/10/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。