rodio
Rust 实现的音频播放库
本库最重要的概念在于Source
特征,它表示一个音源(可以是流媒体)。为了播放音频,需要下面三个步骤:
- 创建一个代表流音频的对象。它可以是一个正弦波、一个缓冲器、一个音频解码器等等。你也可以自己实现
Source
特征作为音源。 - 通过
devices
(设备)或default_output_device
(默认输出设备)函数选择一个音频输出设备。 - 调用
play_raw(output, source)
(播放原始音频)
函数play_raw
(播放原始音频)需要音源产生f32
采样率的音频信号,实际使用时可能音源并非使用f32
的采样率,这种情况下可能会出现编译错误,可以通过调用在音源对象上调用.convert_samples()
修复这个问题。
以下为播放一个音频文件的示范:
use std::fs::File;
use std::io::BufReader;
use rodio::Source;
fn main() {
let (stream, stream_handle) = rodio::OutputStream::try_default().unwrap();
// 使用Cargo.toml文件所在的相对路径加载音频文件
let file = File::open("sound.ogg").unwrap();
let source = rodio::Decoder::new(BufReader::new(file)).unwrap();
stream_handle.play_raw(source.convert_samples());
// 声音会通过一个独立的音频线程播放,
// 所以我们需要在音频播放过程中保证主线程没有关闭。
// 完成后,按 ctrl + C 强制关闭进程。
loop {}
}
Sink(音轨)
为了能方便的控制音频的播放,rodio
库提供了一个叫做Sink
的类型,每一个Sink
代表一个音轨。
除了使用play_raw
播放之外,还可以通过向Sink
中添加音源来进行播放。
use rodio::Sink;
let (stream, stream_handle) = rodio::OutputStream::try_default().unwrap();
let sink = rodio::Sink::try_new(&stream_handle).unwrap();
// 出于示例原因,添加一个虚拟源。
let source = rodio::source::SineWave::new(440);
sink.append(source);
append
方法会在Sink
的末尾添加音频,这些音频会被依次播放。如果你需要同时播放多个音频,则需要创建多个Sink
。
Sink
类型还提供了例如播放、暂停以及音量控制等功能。
Filters(过滤器)
Source
特征还提供了不同的过滤器,与标准的Iterator
特征相似。
示例:
use rodio::Source;
use std::time::Duration;
// 永远重复音频的前五秒。
let source = source.take_duration(Duration::from_secs(5)).repeat_infinite();
运作原理
Rodio
产生一个后台线程,专用于从音源中读取音频数据并将数据发送到音频输出设备。 每当放弃对Source
的所有权以进行播放时,音频流数据都会被发送到此后台线程,rodio将在该后台线程中读取它。
所有音频都将由Rodio混合在一起,然后再发送到操作系统或硬件。因此,对同时播放的声音数量或可以创建的Sink
数量没有限制(除非创建过多的Sink
会降低程序速度)。
模块
buffer | 来自缓冲区的简单音频样本来源。 |
---|---|
decoder | 解码音频文件中的样本。 |
dynamic_mixer | 可同时播放多个音频的混合器。 |
queue | 按次序播放多个音频的队列。 |
source | 多种声音和过滤器的源。 |
static_buffer | 来自静态缓冲区的简单样本来源。 |
结构型
Device | 与平台的动态调度主机类型关联的设备实现。 |
---|---|
Devices | 与平台的动态调度主机类型关联的设备迭代器。 |
OutputStream | cpal::Stream 容器。 |
OutputStreamHandle | 提供回放的OutputStream 的更灵活的句柄。 |
Sink | 处理输出声音的设备。 |
SpatialSink | |
SupportedStreamConfig | 描述单个受支持的流配置。 |
Enums
DevicesError | 在一个系统上尝试枚举可用设备时的错误 |
---|---|
PlayError | 尝试播放音频时发生的错误 |
StreamError | 流错误 |
Traits
DeviceTrait | 能够进行音频输入或输出的设备。 |
---|---|
Sample | 表示单个样本的值。 |
Type Definitions
InputDevices | 只返回输入设备的主机设备迭代器。 |
---|---|
OutputDevices | 只返回输出设备的主机设备迭代器。 |
评论区
写评论播放mp3 每隔7秒 有杂音
噗哈哈哈哈哈哈
--
👇
chenwei767: 能不能搞个编译完成后放声音. rust编译太久了
能不能搞个编译完成后放声音. rust编译太久了