音乐流媒体播放器

原理

音频播放使用 rodio 库管理硬件后端。工作流程:

  1. 创建 OutputStream → 获取音频设备句柄
  2. 通过 Decoder 解码音频文件(MP3/WAV/FLAC)
  3. Sink 封装播放队列,控制开始/暂停/停止/音量

音频解码路径:文件 → rodio::Decoder → PCM 样本流 → 音频设备播放缓冲区。解码在后台线程执行,通过 Sink::append 异步队列添加新音轨。

流媒体使用 reqwest 建立 HTTP 连接,通过 Stream trait 逐步接收字节,交给 Decoder::new(Cursor::new(data)) 解码。

安全: 音频安全


语法

[dependencies]
rodio = "0.19"
reqwest = { version = "0.12", features = ["stream"] }
use rodio::{Decoder, OutputStream, Sink, Source};
use std::fs::File;
use std::io::BufReader;
 
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let (_stream, handle) = OutputStream::try_default()?;
    let sink = Sink::try_new(&handle)?;
 
    let file = BufReader::new(File::open("song.mp3")?);
    let source = Decoder::new(file)?;
    sink.append(source);
 
    sink.set_volume(0.5);
    sink.play();
    sink.pause();
    sink.stop();
 
    sink.sleep_until_end();
    Ok(())
}

实践

力扣问题

算法无关。建议关注文件 I/O 和缓冲区管理的最佳实践。

AI 自检

  1. OutputStream 的内部音频线程模型是什么?Sink 如何在多线程间同步?
  2. MP3 解码为 PCM 的过程?杆率(sampling rate)、位深(bit depth)的概念?