56个版本 (破坏性更新)
1.0.0-rc.6 | 2024年4月20日 |
---|---|
1.0.0-rc.2 | 2024年3月7日 |
0.45.2 | 2024年6月12日 |
0.42.0 | 2024年2月5日 |
0.3.0 | 2021年3月9日 |
#12 in 音频
1,632 每月下载量
用于 3 crate
1MB
21K SLoC
Rust Web Audio API
一个用于非浏览器环境下的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
。
针对浏览器
我们可以完整地循环,并通过 cpal
的 wasm-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