如何在Rust中使用minimp3和alto?

问题描述 投票:0回答:1

有没有一个例子可以说明如何在Rust中使用alto的minimp3?我尝试了一个非常基本的设置,但是alto的文档并没有什么帮助。

[dependencies]
minimp3 = "*"
alto = "*"
use minimp3::{Decoder, Frame, Error};
use alto::{Alto, Stereo};

use std::fs::File;

fn main() {
    println!("Playback test");
    let mut decoder = Decoder::new(File::open("damien.mp3").unwrap());
    let alto = Alto::load_default().expect("shit");

    for s in alto.enumerate_outputs() {
        println!("Found device: {}", s.to_str().expect("shit"));
    }

    let device = alto.open(None).expect("can't no open"); // Opens the default audio device
    let context = device.new_context(None).expect("cant create no contexto"); // Creates a default context

    // Configure listener
    context.set_position([1.0, 4.0, 5.0]);
    context.set_velocity([2.5, 0.0, 0.0]);
    context.set_orientation(([0.0, 0.0, 1.0], [0.0, 1.0, 0.0]));

    let source = context.new_static_source().expect("busshit");

    loop {
        match decoder.next_frame() {
            Ok(Frame { data, sample_rate, channels, .. }) => {
                context.new_buffer::<Stereo<i16>, [i16]>(data, 44_100);
            },
            Err(Error::Eof) => break,
            Err(e) => panic!("{:?}", e),
        }
    }
}

问题是在第28行,我不能匹配... data 到正确的类型。

context.new_buffer::<Stereo<i16>, [i16]>(data, 44_100);

我不知道该怎么做 data: B 应该是。

audio rust mp3 minimp3 alto
1个回答
0
投票

我会把它从:

context.new_buffer::<Stereo<i16>, [i16]>(data, 44_100);

改成

context.new_buffer::<Stereo<i16>, _>(data, sample_rate);

它要找的类型是 Vec<i16> 但你可以使用 _ 来让它推断类型。

如果你使用的是StaticSource,你可能需要先读取整个mp3文件,然后再用 context.new_buffer 循环之后。

否则,你可以使用StreamingSource,然后用 source.queue_buffer. 这里有一个很好的例子,它可以将初始的5个缓冲区排成队,然后在他们玩完后用新的缓冲区来补充。例子.

© www.soinside.com 2019 - 2024. All rights reserved.