9个版本
0.4.1 | 2021年2月17日 |
---|---|
0.4.0 | 2021年2月8日 |
0.3.1 | 2020年10月26日 |
0.3.0 | 2019年5月20日 |
0.1.2 | 2018年7月22日 |
#382 in 音频
每月133次下载
用于 caper
145KB
3K SLoC
ambisonic
创作和播放3D音频。
ambisonic库在rodio
之上提供了3D声音场景的支持。它允许在虚拟听众周围自由定位和移动声音源,并通过声卡实时播放生成的空间混合。
功能
- 逼真的方向性音频
- 将
rodio
声音源放置在空间中 - 移动声音的多普勒效应
画廊
- 视频展示了@bjadamson通过3D图形场景演示的空间音频
使用方法
将此添加到您的Cargo.toml
[dependencies]
ambisonic = "0.4.0"
使用示例
Ambisonic可以为您生成正弦波
use std::thread::sleep;
use std::time::Duration;
use ambisonic::{rodio, AmbisonicBuilder};
let scene = AmbisonicBuilder::default().build();
let source = rodio::source::SineWave::new(440);
let mut sound = scene.play_at(source, [50.0, 1.0, 0.0]);
// move sound from right to left
sound.set_velocity([-10.0, 0.0, 0.0]);
for i in 0..1000 {
sound.adjust_position([50.0 - i as f32 / 10.0, 1.0, 0.0]);
sleep(Duration::from_millis(10));
}
sound.set_velocity([0.0, 0.0, 0.0]);
由于Ambisonic建立在Rodio之上,因此Rodio支持的任何文件格式都可以加载并定位在3D空间中。
let file = std::fs::File::open("path/to/your/file.wav").unwrap();
let source = rodio::Decoder::new(std::io::BufReader::new(file)).unwrap();
let source = source.repeat_infinite();
let mut sound = scene.play_at(source.convert_samples(), [50.0, 1.0, 0.0]);
// move sound from right to left
sound.set_velocity([-10.0, 0.0, 0.0]);
for i in 0..1000 {
sound.adjust_position([50.0 - i as f32 / 10.0, 1.0, 0.0]);
sleep(Duration::from_millis(10));
}
sound.set_velocity([0.0, 0.0, 0.0]);
技术细节
ambisonic
围绕着声音场的中间表示概念构建,称为B格式。该B格式描述了听众应该听到什么,与他们的音频播放设备无关。这导致音频场景创作和渲染之间的明确分离。有关详细信息,请参阅维基百科。
在其当前状态下,该库允许将单通道rodio
源的空间组合到一阶B格式流。所选渲染器然后将B格式流解码为播放的音频信号。
目前,以下渲染器可用
- 立体声:在两个立体声扬声器或耳机上的简单高效播放
- HRTF:使用头部相关传递函数在耳机上实现逼真的3D声音
尽管目前只支持立体声输出,但B格式抽象应该使得在未来实现任意扬声器配置变得容易。
学习资源
https://github.com/mbillingr/ambisonic/blob/master/documents/info.md
许可证
根据以下任一许可证授权:
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,旨在包含在作品中,将按照上述方式双重授权,无需任何附加条款或条件。
依赖关系
约2-6.5MB
约127K SLoC