< 返回版块

neptune-v 发表于 2020-10-18 01:15

Tags:playback,audio,game

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 只返回输出设备的主机设备迭代器。

评论区

写评论
cspq 2020-10-19 09:16

播放mp3 每隔7秒 有杂音

LT 2020-10-19 00:40

噗哈哈哈哈哈哈

--
👇
chenwei767: 能不能搞个编译完成后放声音. rust编译太久了

chenwei767 2020-10-18 18:43

能不能搞个编译完成后放声音. rust编译太久了

1 共 3 条评论, 1 页