typescript - Hur kan jag dynamiskt ändra uppspelningshastighet i Web Audio API
Jag är ganska ny på Web Audio API och jag försöker ändra uppspelningshastigheten på ett ljud utan att behöva stoppa/pausa det. För närvarande fungerar denna kodbit (TypeScript): Jag laddar ljudet på detta sätt:
private init(): void {
const tmpLoop: Audio = this.engineLoop = new Audio(this.cameraManager.listener);
const idleLoader: AudioLoader = new AudioLoader();
idleLoader.load("../../assets/sounds/engine.ogg",
(buffer: AudioBuffer) => {
tmpLoop.setBuffer(buffer);
tmpLoop.setLoop(true);
tmpLoop.setVolume(0.5);
},
() => { },
() => { });
}
Och sedan ändrar jag playback-hastigheten för varje bildruta på det här sättet:
public modifyPlayBackSpeed(rpm: number): void {
if(rpm > 800)
{
this.engineLoop.pause();
this.engineLoop.playbackRate = (2/4700)*(rpm-800)+1;
this.engineLoop.play();
}
Men det är inte alls lika flytande som jag skulle vilja, eftersom det fortsätter att klippa provet varje bildruta.
Jag skulle vilja att ljudet spelas kontinuerligt medan uppspelningshastigheten ändras, som det här motorljudet.
Svar #1
Du kan använda SoundTouchJS för detta. Dokumentationen är lite otillräcklig, så du måste titta på källkoden, men det finns en 'rate'-egenskap du kan justera som kommer att sakta ner/snabba upp uppspelningshastigheten på din ljudkällnod. Ge en reglage eller något i ditt gränssnitt och koppla dess värde till 'rate'-egenskapen i ett onChange-händelse.
Svar #2
ThreeJS-dokumentationen innehåller: Audio.setPlaybackRate(), vilket gör precis det du behöver!
(och det är ganska smidigt, jag hör inget klippande från vad jag just testade)