4个版本 (2个稳定版)
1.0.1 | 2024年6月18日 |
---|---|
1.0.0 | 2021年7月4日 |
0.1.1 | 2021年4月12日 |
0.1.0 | 2021年4月12日 |
#113 in 音频
每月下载量 42
24KB
386 行
Magnum (Opus工具)
提供从Rust Reader解码Xiph.org的Opus音频编解码器的支持。Opus音频可以是标准的Ogg容器格式,也可以是Apple Core Audio (.caf)格式。
提供功能,支持以Kira AudioStream或Rodio的Source输出,同时也可以获取原始帧数据,请参见下面的示例。
功能与兼容性
默认情况下,此库提供Ogg和Caf容器支持,但如果你只想启用对一个的支持,你可以在你的Cargo.toml
中的功能列表中手动选择提供with_ogg
或with_caf
。
启用以下功能将提供与那些库兼容所需的相关特质,但你需要有与该库中使用的版本完全匹配的库版本。(参见版本列中当前支持的版本)
功能 | 支持以下 | 版本 |
---|---|---|
with_kira |
Kira | 0.5.3 |
with_rodio |
Rodio | 0.14.0 |
示例用法
使用Magnum与Rodio
将以下内容添加到你的Cargo.toml
的依赖项部分
[dependencies]
magnum = { version = "*", features = ["with_rodio"] }
在你的应用程序代码中
// Dependencies
use rodio::{OutputStream, Sink};
use magnum::container::ogg::OpusSourceOgg;
// ...
// Set up your OutputStream as usual in Rodio
let (_stream, stream_handle) = OutputStream::try_default().unwrap();
// Use a BufReader to open an opus file in Ogg format (in this example)
let file = BufReader::new(File::open("example.opus").unwrap());
// Pass the reader into Magnum's OpusSourceOgg to get a Source compatible with Rodio
let source = OpusSourceOgg::new(file).unwrap();
// Create a Sink in Rodio to receive the Source
let sink = Sink::try_new(&stream_handle).unwrap();
// Append the source into the sink
sink.append(source);
// Wait until the song is done playing before shutting down (As the sound plays in a separate thread)
sink.sleep_until_end();
使用Magnum与Kira
将以下内容添加到你的Cargo.toml
的依赖项部分
[dependencies]
magnum = { version = "*", features = ["with_kira"] }
在你的应用程序代码中
// Dependencies
use kira::{
manager::{AudioManager, AudioManagerSettings},
mixer::TrackIndex,
};
use magnum::container::ogg::OpusSourceOgg;
// ...
// Set up a Kira AudioManager as per normal
let mut audio_manager = AudioManager::new(AudioManagerSettings::default()).unwrap();
// Use a BufReader to open an opus file in Ogg format (in this example)
let file = BufReader::new(File::open("example.opus").unwrap());
// Pass the reader into Magnum's OpusSourceOgg to get an AudioStream compatible with Kira
let source = OpusSourceOgg::new(file).unwrap();
// Add the stream to the main track of the audio manager to start playing it
audio_manager.add_stream(source, TrackIndex::Main).unwrap();
// Keep the thread alive for the duration of the song since it plays in a background thread
thread::sleep(Duration::from_secs(200));
独立模式下的Magnum使用
你可以使用Magnum来收集Opus帧和如采样率、通道数等元数据信息。有了这些信息,你可以将其传递给任何你选择的音频播放或处理库。
提示:你可以使用Kira的Sound::from_frames
方法使用此方法添加Opus音频文件以进行常规播放。(与上面的AudioStream方法相比)
use magnum::container::ogg::OpusSourceOgg; // Or change to Caf where appropriate
// Use a BufReader to open an opus file in Ogg format
let file = BufReader::new(File::open("example.opus").unwrap());
// Pass the reader into Magnum's OpusSourceOgg to get an Iterator of frames
let source = OpusSourceOgg::new(file).unwrap();
// Pull frames one at a time like you would with any Iterator
let frame = source.next(); // Pulls the next frame, returns None when data ends
// NOTE: For multi-channel audio, the frames alternate between channels, so
// you will want to use the metadata to detect the channel count and act
// appropriately.
let channels = source.metadata.channel_count;
// You will also probably need the sample rate to play back the song at the
// correct pitch & timing
let sample_rate = source.metadata.sample_rate;
待办事项
- 测试
- 更好的错误处理
- 可运行示例
- 更多容器格式 (.mkv等)
- 搜索支持(目前仅限于线性播放)
贡献
帮助总是受欢迎!请随时提交任何拉取请求或通过Twitter @seratonik联系我以协调。
依赖关系
~3–8.5MB
~151K SLoC