#dsp #sound

web-audio-api

一个用于非浏览器环境下的Web Audio API的纯Rust实现

56个版本 (破坏性更新)

1.0.0-rc.62024年4月20日
1.0.0-rc.22024年3月7日
0.45.2 2024年6月12日
0.42.0 2024年2月5日
0.3.0 2021年3月9日

#12 in 音频

Download history 232/week @ 2024-05-02 52/week @ 2024-05-09 62/week @ 2024-05-16 40/week @ 2024-05-23 509/week @ 2024-05-30 1427/week @ 2024-06-06 1187/week @ 2024-06-13 923/week @ 2024-06-20 382/week @ 2024-06-27 403/week @ 2024-07-04 262/week @ 2024-07-11 148/week @ 2024-07-18 539/week @ 2024-07-25 428/week @ 2024-08-01 403/week @ 2024-08-08 241/week @ 2024-08-15

1,632 每月下载量
用于 3 crate

MIT 许可证

1MB
21K SLoC

Rust Web Audio API

crates.io docs.rs

一个用于非浏览器环境下的Web Audio API的纯Rust实现

关于Web Audio API

Web Audio API (MDN文档) 提供了一个强大而通用的系统来控制Web上的音频,允许开发者选择音频源、添加音频效果、创建音频可视化、应用空间效果(如声像)等等。

我们的Rust实现将Web Audio API从Web中解耦。现在您可以在桌面应用程序、命令行工具、无头执行等环境中使用它。

示例用法

use web_audio_api::context::{AudioContext, BaseAudioContext};
use web_audio_api::node::{AudioNode, AudioScheduledSourceNode};

// set up the audio context with optimized settings for your hardware
let context = AudioContext::default();

// for background music, read from local file
let file = std::fs::File::open("samples/major-scale.ogg").unwrap();
let buffer = context.decode_audio_data_sync(file).unwrap();

// setup an AudioBufferSourceNode
let mut src = context.create_buffer_source();
src.set_buffer(buffer);
src.set_loop(true);

// create a biquad filter
let biquad = context.create_biquad_filter();
biquad.frequency().set_value(125.);

// connect the audio nodes
src.connect(&biquad);
biquad.connect(&context.destination());

// play the buffer
src.start();

// enjoy listening
std::thread::sleep(std::time::Duration::from_secs(4));

有关更多信息,请参阅 文档

规范符合性

我们尽量与官方W3C规范保持一致,但某些偏差无法避免

  • 命名:使用snake_case而不是CamelCase
  • 使用getter/setter方法而不是公开的属性
  • 引入了一些命名空间
  • 使用特质来模拟继承

绑定

我们在https://github.com/ircam-ismm/node-web-audio-api 提供了此库的NodeJS绑定,因此您可以通过编写原生NodeJS代码来使用此库。

这使我们能够运行官方的 WebAudioAPI测试工具跟踪我们的规范符合性分数

音频后端

默认情况下,使用 cpal 库进行跨平台音频I/O。

我们通过 cubeb 特性标志提供对 cubeb 后端的实验性支持。请注意,必须在本地上安装 cmake 才能运行 cubeb

特性标志 后端
cpal (默认) ALSA, WASAPI, CoreAudio, Oboe (Android)
cpal-jack JACK
cpal-asio ASIO 查看以下链接 https://github.com/rustaudio/cpal#asio-on-windows
cubeb PulseAudio, AudioUnit, WASAPI, OpenSL, AAudio, sndio, Sun, OSS

Linux 用户注意事项

在 Linux 上使用 ALSA 后端库时,使用默认渲染大小(即 128 帧)可能会导致意外的刺耳声音。在这种情况下,一个简单的解决方案是在创建音频上下文时传递 AudioContextLatencyCategory::Playback 延迟提示,这将增加渲染大小到 1024 帧

let audio_context = AudioContext::new(AudioContextOptions {
    latency_hint: AudioContextLatencyCategory::Playback,
    ..AudioContextOptions::default()
});

对于需要低延迟的实时和交互式应用程序,您应改用 cpal 提供的 JACK 后端。为此,您需要一个运行的 JACK 服务器,并用 cpal-jack 功能构建您的应用程序,例如 cargo run --release --features "cpal-jack" --example microphone

针对浏览器

我们可以完整地循环,并通过 cpalwasm-bindgen 后端将 Rust WebAudio 输出管道回浏览器。查看 一个 WASM 项目示例。警告:实验性功能!

贡献

web-audio-api-rs 欢迎所有人以建议、错误报告、拉取请求和反馈的形式进行贡献。💛

如果您需要贡献的想法,有几种开始的方式

  • 尝试一些我们的示例(位于 examples/ 目录),并开始构建您自己的音频图
  • 发现了一个错误或有一个功能请求? 提交一个问题
  • 带有 good first issue 标签的问题相对容易作为入门问题。

除非您明确表示,否则您提交给 web-audio-api-rs 的任何有意贡献的内容,都将按 MIT 许可证授权,没有任何附加条款或条件。

许可证

本项目采用 MIT 许可证

致谢

用于 HRTF 空间化的 IR 文件是 Ircam 的 EAC 团队创建的 LISTEN 数据库的一部分。

依赖项

~9–39MB
~662K SLoC