本库最重要的概念在于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
只返回输出设备的主机设备迭代器。