当前位置 : 主页 > 编程语言 > java >

【每周一库】- Rodio - 一个Rust音频播放库

来源:互联网 收集:自由互联 发布时间:2022-06-22
本库最重要的概念在于​​Sou​​​​rce​​特征,它表示一个音源(可以是流媒体)。为了播放音频,需要下面三个步骤: 创建一个代表流音频的对象。它可以是一个正弦波、一个缓

本库最重要的概念在于​​Sou​​​​rce​​特征,它表示一个音源(可以是流媒体)。为了播放音频,需要下面三个步骤:

  • 创建一个代表流音频的对象。它可以是一个正弦波、一个缓冲器、一个音频解码器等等。你也可以自己实现​​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

只返回输出设备的主机设备迭代器。


网友评论