#opus #ogg #kira #rodio #xiph #audio-playback #encoding

magnum

支持在常见容器格式中读取Opus音频文件的迭代器/源。包括可选的特性,以支持Kira和Rodio音频库的播放。

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

MIT许可证

24KB
386

Magnum (Opus工具)

LICENSE

提供从Rust Reader解码Xiph.org的Opus音频编解码器的支持。Opus音频可以是标准的Ogg容器格式,也可以是Apple Core Audio (.caf)格式。

提供功能,支持以Kira AudioStream或Rodio的Source输出,同时也可以获取原始帧数据,请参见下面的示例。

功能与兼容性

默认情况下,此库提供Ogg和Caf容器支持,但如果你只想启用对一个的支持,你可以在你的Cargo.toml中的功能列表中手动选择提供with_oggwith_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