[英]Create sound on sound with the hound
你如何制作一個文件,例如:“ out.wav ”,並在其中添加“ 1.wav ” 10次,但沒有延遲。 即,將聲音疊加到另一個聲音上,即使前一個聲音還沒有播放完。 正如我現在嘗試做的大約一個半小時,我得到的只是一個一個地播放(即:首先聲音完全播放)
最簡單的代碼:
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();
}
}
您必須以某種方式讀取和混合您想要同時播放的多種聲音。
這是一個示例,播放 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
中一次,然后從那里讀取)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.