#audio-playback #playback #sound #format #file-format #low-overhead

awedio

低开销且可适应的音频播放库

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 音频

Download history 2/week @ 2024-05-13 154/week @ 2024-05-20 139/week @ 2024-05-27 22/week @ 2024-06-03 18/week @ 2024-06-10 46/week @ 2024-07-01 9/week @ 2024-07-08 202/week @ 2024-07-29 7/week @ 2024-08-05

每月下载量 210
用于 awedio_esp32

MIT/Apache 许可

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 文件,其采样率与输出设备相同,将发送到后端的数据保持不变。
  • 只有在需要时才支付功能的性能成本。例如,暂停、音量调整或在播放开始后控制声音都仅按需添加到声音中。这是通过将实现类似于标准库中 IteratorSound 类型的包装器包装起来来实现的。
  • 适用于低资源环境,例如 esp32 微控制器。当前需要 std。
  • 示例为 i16,为了简单起见,至少目前如此(如果这阻止您使用此库,请告诉我您的用例)

API 概述

  • Sound 特性 - 提供要播放的声音样本。具有修改声音的包装器函数。
  • Manager - 将声音播放到后端。
  • SoundList - 要依次播放的一系列声音。

当前后端

  • 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-wavrmp3-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.0MIT许可证的许可。

除非您明确声明,否则您提交的任何贡献,根据Apache-2.0许可证定义,都应如上双许可,没有任何额外的条款或条件。

依赖项

~0.5–31MB
~465K SLoC