设置持续时间后,AudioBufferSourceNode 不循环
AudioBufferSourceNode not looping when duration is set
我一直在玩 js 音频网络 api。
我想要实现的是循环播放一段曲目。
循环播放整首曲目没问题,但如果我定义了一个持续时间,那么它就不再循环了……我想我需要的是一个标记,而不是一个持续时间……如果有办法的话要做到这一点?
const audioCtx = new AudioContext();
const srcUrl = 'https://freesound.org/data/previews/251/251248_1137749-lq.mp3';
let srcArrayBuffer;
let playingTrack;
async function loadSrcAudioFile(url) {
const response = await fetch(url);
const buffer = await response.arrayBuffer();
return buffer;
}
function loop() {
playingTrack = audioCtx.createBufferSource();
playingTrack.connect(audioCtx.destination);
playingTrack.buffer = srcArrayBuffer;
playingTrack.loop = true;
//playingTrack.loopStart = 0;
//playingTrack.loopEnd = 1.5;
playingTrack.start(audioCtx.currentTime, 0, 1.5);
}
function stop() {
playingTrack.stop();
playingTrack = null;
}
async function play() {
if (!srcArrayBuffer) {
const buffer = await loadSrcAudioFile(srcUrl);
srcArrayBuffer = await audioCtx.decodeAudioData(buffer);
}
loop();
}
document.getElementById('playBtn').addEventListener('click', play);
document.getElementById('stopBtn').addEventListener('click', stop);
你快到了。设置持续时间意味着“播放这个时间”。无论如何它都会在 1.5 秒后停止。它不关心缓冲区是否循环。
设置 loopStart
和 loopEnd
而不指定持续时间即可。
https://jsfiddle.net/4yeavmp3/
例如,如果您想循环播放 4 次,您可以将持续时间设置为 6。
我一直在玩 js 音频网络 api。 我想要实现的是循环播放一段曲目。
循环播放整首曲目没问题,但如果我定义了一个持续时间,那么它就不再循环了……我想我需要的是一个标记,而不是一个持续时间……如果有办法的话要做到这一点?
const audioCtx = new AudioContext();
const srcUrl = 'https://freesound.org/data/previews/251/251248_1137749-lq.mp3';
let srcArrayBuffer;
let playingTrack;
async function loadSrcAudioFile(url) {
const response = await fetch(url);
const buffer = await response.arrayBuffer();
return buffer;
}
function loop() {
playingTrack = audioCtx.createBufferSource();
playingTrack.connect(audioCtx.destination);
playingTrack.buffer = srcArrayBuffer;
playingTrack.loop = true;
//playingTrack.loopStart = 0;
//playingTrack.loopEnd = 1.5;
playingTrack.start(audioCtx.currentTime, 0, 1.5);
}
function stop() {
playingTrack.stop();
playingTrack = null;
}
async function play() {
if (!srcArrayBuffer) {
const buffer = await loadSrcAudioFile(srcUrl);
srcArrayBuffer = await audioCtx.decodeAudioData(buffer);
}
loop();
}
document.getElementById('playBtn').addEventListener('click', play);
document.getElementById('stopBtn').addEventListener('click', stop);
你快到了。设置持续时间意味着“播放这个时间”。无论如何它都会在 1.5 秒后停止。它不关心缓冲区是否循环。
设置 loopStart
和 loopEnd
而不指定持续时间即可。
https://jsfiddle.net/4yeavmp3/
例如,如果您想循环播放 4 次,您可以将持续时间设置为 6。