gpt4 book ai didi

javascript - 播放源缓冲区的一部分时未触发 Web 音频事件 "ended"

转载 作者:可可西里 更新时间:2023-11-01 13:33:02 27 4
gpt4 key购买 nike

我们有一个网络音频助手功能,可以播放声音表中的声音,并在播放完毕时通知我们。过去,我们在更新循环中使用 playbackState 来检查节点是否已完成播放,但由于 Chrome 36 现在使用当前规范,它不支持 playbackState 我们更新了代码以使用 'ended' 事件。

然而,这似乎并没有被解雇。

以下是我们的 playAudio 函数:-

playAudio: function(trackName){
var node = this._atx.createBufferSource();
node.buffer = this._buffer;

var gain = this._atx.createGain();

node.connect(gain);
gain.connect(this._atx.destination);

var start = this._tracks[trackName][0];
var length = this._tracks[trackName][1] - start;

node.start(0, start, length);

var sound = {name: trackName, srcNode: node, gainNode: gain, startTime: this._atx.currentTime, duration: length, loop: false, playHeadStart: start};

if (this._features.hasEvents) {
//node.addEventListener("ended", function () {
// this._soundEnded(sound)
//}.bind(this));
node.onended = function(){
this._soundEnded(sound);
}.bind(this);
}

this._playingSounds[++this._soundId] = sound;
return this._soundId;
},
_soundEnded: function (sound) {
this._playingSounds[sound] = null;
delete this._playingSounds[sound];
}

this._features.hasEvents 变量通过检查加载期间创建的音频节点上的 node.onended !== null 来设置。缓冲区是通过 XHR 文件创建的。这可以是 mp3 或 m4a,具体取决于我们播放的内容。

_soundedEnded 函数没有被调用的原因是什么?我已经尝试了 node.onended = function(){...}node.addEventListener("ended", function(){..}) 语法,两者都没有运气。我们似乎在 iOS 7 Safari 和桌面/Android Chrome 中有相同的行为。

最佳答案

在意识到我在做一些愚蠢的事情之后,我刚刚解决了这个问题。该 bug 与 WebAudio 无关,而是与应该从 _playingSounds 数组中删除声音对象的回调函数有关。

这段代码:

var sound = {name: trackName, srcNode: node, gainNode: gain, startTime:     this._atx.currentTime, duration: length, loop: false, playHeadStart: start};

if (this._features.hasEvents) {
//node.addEventListener("ended", function () {
// this._soundEnded(sound)
//}.bind(this));
node.onended = function(){
this._soundEnded(sound);
}.bind(this);
}

this._playingSounds[++this._soundId] = sound;
return this._soundId;

应该更像这样:

var sound = {name: trackName, srcNode: node, gainNode: gain, startTime: this._atx.currentTime, duration: length, loop: false, playHeadStart: start};
var soundId = ++this._soundId;
if (this._features.hasEvents) {

node.onended = function(){
this._soundEnded(soundId);
}.bind(this);
}

this._playingSounds[soundId] = sound;
return soundId;

我试图通过值而不是键删除对象,这显然行不通。代码现在将 key 传递给函数,然后一切又恢复正常了。

关于javascript - 播放源缓冲区的一部分时未触发 Web 音频事件 "ended",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25077703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com