回声园音频 I/ 欧
一个提供低级音频输出的节点.js软件包(音频输入尚未执行用于各种平台的常见音频API:
- MME (多媒体扩展) (Wave Out) 在Windows(x64, arm64) 上 :
- 核心音频 (通过低纬度) 音频单位)在macOS上(x64,arm64)使用
- ALSA (高级 Linux 声音架构) 在 Linux (x64, arm64) 上显示
代码非常简陋,不依赖任何外文库,只有直接的系统调用.
每个平台都有一个独立 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 或更新)
许可证
麻省理工学院