如何将静态字节数组转为BufReader?解决Rodio音频Seek trait报错
解决rodio中从静态字节数组解码AIF音频的问题
当然可以解决这个问题——你需要用std::io::Cursor来包装静态字节数组,它能为&[u8]提供Seek trait的实现,刚好满足rodio::Decoder::new对输入类型Read + Seek的要求。
具体实现步骤
- 嵌入AIF音频字节:用
include_bytes!宏把音频文件的字节直接编译进二进制:
static AIF_AUDIO: &[u8] = include_bytes!("your_audio_file.aif");
- 用Cursor包装字节数组:
Cursor会维护一个内部位置指针,模拟文件的偏移操作,让静态字节数组支持Seek:
use rodio::{Decoder, OutputStream, Sink}; use std::io::Cursor; fn main() { // 嵌入的AIF音频字节 static AIF_AUDIO: &[u8] = include_bytes!("demo.aif"); // 包装成支持Seek的Cursor let audio_cursor = Cursor::new(AIF_AUDIO); // 初始化解码器 let decoder = Decoder::new(audio_cursor) .expect("Failed to decode AIF audio data"); // 播放音频 let (_stream, stream_handle) = OutputStream::try_default().unwrap(); let sink = Sink::try_new(&stream_handle).unwrap(); sink.append(decoder); sink.sleep_until_end(); }
额外说明:关于BufReader
如果需要缓冲读取优化,你可以在Cursor外层再套一层BufReader,因为Cursor<&[u8]>实现了Read,所以可以被BufReader包装:
use std::io::BufReader; // ... 其他代码 ... let buffered_reader = BufReader::new(Cursor::new(AIF_AUDIO)); let decoder = Decoder::new(buffered_reader).expect("Decoding failed");
这样既保留了Seek能力,又能利用缓冲提升读取效率。
内容的提问来源于stack exchange,提问作者sak
相关产品推荐
相关产品推荐

