You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中rodio放大正弦波报错:找不到scale_amplitude方法

问题描述

尝试播放定向音频时无法放大正弦波,相关代码如下:

fn main() {
    use std::thread::sleep;
    use std::time::Duration;
    use ambisonic::{rodio, AmbisonicBuilder};

    let scene = AmbisonicBuilder::default().build();
    let source = rodio::source::SineWave::new(440).amplify(0.5);
    let mut sound = scene.play_at(source, [50.0, 1.0, 0.0]);

// move sound from right to left
    sound.set_velocity([-10.0, 0.0, 0.0]);
    for i in 0..1000 {
        sound.adjust_position([50.0 - i as f32 / 10.0, 1.0, 0.0]);
        sleep(Duration::from_millis(10));
    }
    sound.set_velocity([0.0, 0.0, 0.0]);
}

运行代码时抛出如下错误:

let source = rodio::source::SineWave::new(440).scale_amplitude(0.5);
  |                                            ^^^^^^^^^^^^^^^ method not found in `SineWave`

移除amplify方法后代码可正常运行,请问错误产生的原因是什么?如何实现正弦波的放大功能?


错误原因

SineWave结构体本身并没有直接定义amplify(或错误信息中提到的scale_amplitude)方法,这个方法是rodio库中Source trait提供的扩展方法。你没有导入该trait,因此编译器无法识别这个方法。

解决方案

有两种方式可以实现正弦波的音量放大:

方式1:导入Source trait

在代码中导入rodio::Source trait,这样就能直接调用amplify方法:

fn main() {
    use std::thread::sleep;
    use std::time::Duration;
    use ambisonic::{rodio, AmbisonicBuilder};
    // 导入Source trait以使用amplify方法
    use rodio::Source;

    let scene = AmbisonicBuilder::default().build();
    let source = rodio::source::SineWave::new(440).amplify(0.5);
    let mut sound = scene.play_at(source, [50.0, 1.0, 0.0]);

// move sound from right to left
    sound.set_velocity([-10.0, 0.0, 0.0]);
    for i in 0..1000 {
        sound.adjust_position([50.0 - i as f32 / 10.0, 1.0, 0.0]);
        sleep(Duration::from_millis(10));
    }
    sound.set_velocity([0.0, 0.0, 0.0]);
}

方式2:手动缩放采样值

如果不想导入trait,可以直接用map方法对每个音频采样值进行缩放,同样能达到调整音量的效果:

fn main() {
    use std::thread::sleep;
    use std::time::Duration;
    use ambisonic::{rodio, AmbisonicBuilder};

    let scene = AmbisonicBuilder::default().build();
    // 通过map方法直接缩放每个采样值,0.5为音量系数
    let source = rodio::source::SineWave::new(440).map(|sample| sample * 0.5);
    let mut sound = scene.play_at(source, [50.0, 1.0, 0.0]);

// move sound from right to left
    sound.set_velocity([-10.0, 0.0, 0.0]);
    for i in 0..1000 {
        sound.adjust_position([50.0 - i as f32 / 10.0, 1.0, 0.0]);
        sleep(Duration::from_millis(10));
    }
    sound.set_velocity([0.0, 0.0, 0.0]);
}

内容的提问来源于stack exchange,提问作者Edwin Meriaux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:17:16