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
相关产品推荐
相关产品推荐

