【发布时间】:2018-04-06 03:59:36
【问题描述】:
我想创建音频文件的无缝循环。但到目前为止,在我使用的所有方法中,结束和开始之间都有明显的差距。
这是我目前尝试过的:
第一种方法是使用 HTML 中的音频并循环播放,但从曲目结尾到开头时仍然存在明显的延迟。
<audio loop autoplay>
<source src="audio.mp3" type="audio/mpeg">
<audio>
然后我从 JavaScript 中尝试了相同的结果:
let myAudio = new Audio(file);
myAudio.loop = true;
myAudio.play();
之后我尝试了这个(根据this answer)
myAudio.addEventListener(
'timeupdate',
function() {
var buffer = .44;
if (this.currentTime > this.duration - buffer) {
this.currentTime = 0;
this.play();
}
},
false
);
我玩弄了缓冲区,但我只是为了减少间隙而不是完全忽略它。
我求助于库 SeamlessLoop (GitHub) 并让它在 Chromium 浏览器中无缝循环(但在最新的 Safari 中没有。没有在其他浏览器中测试)。我用于此的代码:
let loop = new SeamlessLoop();
// My File is 58 Seconds long. Btw there aren't any gaps in the file.
loop.addUri(file, 58000, 'sound1');
loop.callback(soundsLoaded);
function soundsLoaded() {
let n = 1;
loop.start('sound' + n);
}
编辑:我尝试了另一种方法:通过两个不同的音频元素循环播放:
var current_player = "a";
var player_a = document.createElement("audio");
var player_b = document.createElement("audio");
player_a.src = "sounds/back_music.ogg";
player_b.src = player_a.src;
function loopIt(){
var player = null;
if(current_player == "a"){
player = player_b;
current_player = "b";
}
else{
player = player_a;
current_player = "a";
}
player.play();
/*
3104.897 is the length of the audio clip in milliseconds.
Received from player.duration.
This is a different file than the first one
*/
setTimeout(loopIt, 3104.897);
}
loopIt();
但由于浏览器中的毫秒数不一致或不够精细,这并不能很好地工作,但它确实比音频的正常“循环”属性好得多。
谁能引导我正确地循环播放音频?
【问题讨论】:
-
今天尝试了另一个格式为 wav 的文件。文件的结尾/开头没有间隙。仍然有明显的延迟。
-
再次检查文件是否真的没有间隙。但事实并非如此。我在音频播放器中播放并在那里循环播放,过渡非常无缝。
-
我可以在问题中改进什么?
-
“再次检查文件是否真的没有间隙。它没有。我在音频播放器中播放并在那里循环播放,过渡非常无缝。” 我很困惑...这是否意味着您已经解决了问题?
-
@zer00ne 我的意思是音频播放器(如 Windows Media Player / iTunes)中的过渡非常无缝,但在浏览器中却不是。
标签: javascript html audio html5-audio web-audio-api