如何在Web Audio API中使用playbackRate.value时获取当前时间

时间:2014-02-16 20:56:23

标签: html5 html5-audio web-audio

我需要知道正在播放的源的当前时间,但是我不能使用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将是从播放开始所花费的时间与播放的当前时间位置不同,更改播放值。

2 个答案:

答案 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属性的值也会考虑计划的更改。请注意,如果播放速度快速变化,计算值可能会暂时倒退。