rust 用猎犬的声音创造声音

k2fxgqgv  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(150)

如何制作一个文件,例如:“out.wav",并在其中添加“1.wav10次,但没有延迟。也就是说,将声音叠加在另一个声音上,即使前一个声音还没有播放完。就像我现在已经尝试了大约一个半小时,得到的只是一个接一个地播放(即:首先声音完全播放)
最简单的代码:

use hound::{WavReader, WavWriter};

fn main() {
    let mut reader = WavReader::open("1.wav").unwrap();
    let spec = reader.spec();
    let mut writer = WavWriter::create("output.wav", spec).unwrap();

    for _ in 0..10 {
        for sample in reader.samples::<i16>() {
            writer.write_sample(sample.unwrap()).unwrap();
        }

        reader.seek(0).unwrap();
    }
}
knpiaxh1

knpiaxh11#

你必须以某种方式阅读&混合你想同时播放的多个声音。
下面是一个示例,它播放10次相同的声音,每次延迟声音长度的一半,通过简单地平均同时播放的两个剪辑来混合。

use hound::{WavReader, WavWriter};

fn main() {
    let mut reader = WavReader::open("1.wav").unwrap();
    let mut reader2 = WavReader::open("1.wav").unwrap();
    let mut writer = WavWriter::create("output.wav", spec).unwrap();
    let l = reader.len();
    reader.seek(l/2).unwrap();
    for i in 0..l*10 {
        if i % (l/2) == 0 {
            reader.seek(0).unwrap();
            let tmp = reader;
            reader = reader2;
            reader2 = tmp;
        }
        let s1 = reader.samples::<i16>().next().unwrap().unwrap();
        let s2 = reader2.samples::<i16>().next().unwrap().unwrap();
        let sample = s1/2 + s2/2;
        writer.write_sample(sample).unwrap();
    }
}

这肯定可以清理了很多(即存储在一个Vec的样本一次,只是从那里读取)

相关问题