8 个不稳定版本 (3 个破坏性更新)
0.4.1 | 2024 年 7 月 31 日 |
---|---|
0.4.0 | 2024 年 5 月 29 日 |
0.3.2 | 2024 年 5 月 23 日 |
0.3.1 | 2023 年 12 月 8 日 |
0.1.1 | 2023 年 5 月 10 日 |
#67 in 音频
每月下载量 210
用于 awedio_esp32
160KB
3.5K SLoC
Awedio —
Rust 的低开销且可适应的音频播放库。
默认支持播放 mp3、wav、flac、aac、ogg、qoa 及由 Symphonia 支持的所有其他格式。
示例
播放单个声音文件
let (mut manager, backend) = awedio::start()?;
manager.play(awedio::sounds::open_file("test.wav")?);
播放声音,在播放开始后可调整音量
use awedio::Sound;
let (mut manager, backend) = awedio::start()?;
let (sound, mut controller) = awedio::sounds::SineWav::new(400.0)
.with_adjustable_volume_of(0.25)
.pausable()
.controllable();
manager.play(Box::new(sound));
std::thread::sleep(std::time::Duration::from_millis(100));
controller.set_volume(0.5);
std::thread::sleep(std::time::Duration::from_millis(100));
controller.set_paused(true);
设计目标
- 模块化设计。易于添加新的后端、包装器和解码器。
- 非常低的开销。例如,具有 i16 样本的 Wav 文件,其采样率与输出设备相同,将发送到后端的数据保持不变。
- 只有在需要时才支付功能的性能成本。例如,暂停、音量调整或在播放开始后控制声音都仅按需添加到声音中。这是通过将实现类似于标准库中
Iterator
的Sound
类型的包装器包装起来来实现的。 - 适用于低资源环境,例如 esp32 微控制器。当前需要 std。
- 示例为 i16,为了简单起见,至少目前如此(如果这阻止您使用此库,请告诉我您的用例)
API 概述
当前后端
- cpal - 用于流行的环境,如 Linux、Windows、Mac OS、Android 等... 通过
cpal
功能启用(默认开启)。 - esp32 - 用于 esp32 微控制器和 esp-idf。在它自己的 crate 中实现。
后端通过从 [BackendSource](例如 Renderer)中拉取样本来实现。
Cargo 特性
async
:启用依赖于 tokio-sync 的异步功能。cpal
:启用 cpal 后端。symphonia-all
:启用 Symphonia 支持的所有格式和编解码器。symphonia-
:将 symphonia 的所有功能标志重新导出,前缀为symphonia-
。hound-wav
:使用 Hound 启用 wav 解码。rmp3-mp3
:使用 rmp3 启用 mp3 解码。qoa
:使用 qoaudio 启用 qoa 解码。
默认情况下启用所有功能,除了 hound-wav
和 rmp3-mp3
,因为 symphonia 默认处理这些格式。
根据需要,依赖的库应禁用默认功能。
动机
为创建 10 Buttons(一款无屏幕儿童平板电脑)的活动而构建。有意保持通用性,以便在其他环境中使用。
替代方案和灵感
感谢以下音频播放库,它们启发了本库,并为本库提供了参考。
- Rodio
- 一个非常流行的 Rust 音频播放 crate。
- 与 cpal 紧密耦合。Awedio 允许与 cpal 或其他后端轻松集成。
- 有一个 Sink,类似于
SoundList::new().pausable().with_adjustable_volume().controllable()
... - Mixer 将所有内容转换为 f32。Awedio 一致地使用 i16。
- 源具有帧长度的概念,其中元数据不应更改,但这对于一些包装器(如 Speed)来说效果不佳。
- 使用标准的 Iterator trait 作为其 Source。Awedio 的 Sound 是它自己的枚举,用于处理元数据更改、暂停和声音结束。
- 没有通过 Sources 传播错误的方法。Awedio 的 sound 返回一个结果,因此可以显式处理错误(如果需要的话)。
- Kira
- 具有非常棒的插值和效果 API。
- Sound trait 要求有左右通道,而不是支持 1 或 N 个通道。
- 所有样本都是 f32。因此,帧始终是 8 字节。Awedio 中单声道 Sound 的帧只有 2 字节。
- 使用 symphonia 进行音频格式解析,并具有几个内部缓冲区,需要更多的内存。Awedio 可选使用 symphonia 或其他需要更少缓冲的解码 crate。
- 所有样本都根据时间戳和采样率进行重采样。Awedio仅在源和输出速率不匹配时才进行重采样。
许可证
此项目根据您的选择,受Apache License, Version 2.0或MIT许可证的许可。
除非您明确声明,否则您提交的任何贡献,根据Apache-2.0许可证定义,都应如上双许可,没有任何额外的条款或条件。
依赖项
~0.5–31MB
~465K SLoC