我需要知道正在播放的源的当前时间,但是我不能使用context.currentTime,因为当我更改source.playbackRate.value时,上下文的速度也不会改变,所以我无法确定声音当前位置的位置。没有别的办法吗?
编辑,一些代码:
我使用此功能从网络加载和播放mp3
function loadSoundFile(url) {
source = null;
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';
request.onload = function(e) {
context.decodeAudioData(request.response, initSound, function() {
alert("error");
});
};
request.send();
}
var source = null;
var inittime = 0;
function initSound(buffer)
{
source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.start(0);
inittime = context.currentTime; //I save the initial time
}
然后要获得音轨的实际位置,我应该这样做:
var current_position = context.currentTime-inittime;
这项工作很好,而我不在源中更改playbackRate:
source.playbackRate.value
我需要动态更改此值以使音轨与正在播放的另一个音轨同步,因此如果音轨的实际位置低于从“服务器”接收的位置或慢,我需要加速如果它更高的话。但是,如果我改变播放速率,我怎么知道当前音轨的位置在哪里?
事实上现在如果我使用
var current_position = context.currentTime-inittime;
current_position将是从播放开始所花费的时间与播放的当前时间位置不同,更改播放值。
答案 0 :(得分:0)
[这是对第一段中的开头问题的回答,并没有考虑到已尝试解决它的编辑代码,我还没有审核过]
当然有办法!总会有办法的!你必须自己设计它!
Web Audio API确实不需要进一步发展。它为您提供所需的一切。 currentTime将始终告诉您准确的时间。使用它和您的playbackRate,您可以自己跟踪当前位置,每次调整playbackRate时更新位置变量或需要知道当前位置。
每次更新playbackRate或需要知道当前位置时,请按上次更改后的时间(存储上一个currentTime)更新跟踪时间,并使用适当的playbackRate修改添加。嘿presto!现在,您有了自己的当前时间来考虑您感兴趣的playbackRate。只要您想再次开始跟踪,就可以重置跟踪变量。
答案 1 :(得分:0)
使用playbackRate的倒数,并将播放开始后经过的时间乘以该值。假设非离线渲染,在任何给定时间您都可以使用以下内容来计算将playbackRate考虑在内的实际位置:
(context.currentTime - inittime) / source.playbackRate.value;
来自AudioParam.value的文档:
AudioParam接口的value属性表示参数的当前浮点值,该值最初设置为AudioParam.defaultValue的值。
这意味着value
属性的值也会考虑计划的更改。请注意,如果播放速度快速变化,计算值可能会暂时倒退。