AudioBufferSourceNode只有在连接后才能开始播放
AudioBufferSourceNode starts playing only after being connected
在我的对象中,我得到了一个AudioBufferSourceNode
对象(this.bSrc
),连接到一个增益节点(this.audioDestination
),该节点播放已经存储在对象(this.audioBuffer
)中的(有效)AudioBuffer
。
如果this.audioDestination
连接到音频上下文最终目标this.mainContext.destination
并且我在AudioBufferSourceNode
对象(this.bSrc
)上调用start(0)
方法,它将正常播放。
相反,如果this.audioDestination
尚未连接到音频上下文最终目标,则缓冲区将不会播放(没关系),但其播放将延迟到建立连接为止(从而使有关 AudioBufferSourceNode 何时完成播放的任何假设无效)。
我目前正在实现一个插件架构,其中每个插件都有其 audioDestination 增益节点,并且不知道(也一定不能)知道它是否间接连接到最终的音频上下文目标。对我来说,合乎逻辑的是,AudioBufferSourceNode应该立即"播放"并完成,即使它没有连接到最终的音频上下文目标。但似乎不是这样工作的。我是对的还是错的?有没有办法改变这种行为?
法典:
/* Create the audio Context. */
this.mainContext = new webkitAudioContext;
/* Create an audio gain node */
this.audioDestination = this.mainContext.createGainNode();
/* [...] An AudioBuffer gets decoded and stored into this.audioBuffer*/
/* Create an AudioBufferSourceNode and try to play it immediately */
this.bSrc = this.audioContext.createBufferSource();
this.bSrc.connect (this.audioDestination);
this.bSrc.buffer = this.audioBuffer;
this.bSrc.start(0);
/* Create a callback for when the AudioBufferSourceNode finishes playing */
if (!this.bSrc.loop) {
var pbTimer = setTimeout(function() {
this.playFinishedCallback();
}.bind(this), this.audioBuffer.duration * 1000 / this.bSrc.playbackRate.value);
}
/* Connect this.audioDestination to the final AudioContext destination */
/* If this statement is executed after the previous ones, playback will start NOW */
this.audioDestination.connect(this.mainContext.destination);
这是目前在 Chrome 中实现 Web Audio API 的方式,以及其中使用的设计。 有人谈论改变它;事实上,我是你描述的"音频电缆模型"的支持者。 :) 不过,这并不是唯一理智的模型。 在当前实现中没有任何方法可以更改此行为。
但是,有一个简单的解决方法 - 只需将归零增益节点连接到context.destination,并将所有ABSN连接到该节点以及它们(最终)连接到context.destination。
这是有道理的。 将context.destination视为stdout。 如果不连接到context.destination,音频就无处可去。 如果你把最后一行(连接到context.destination)移到你创建增益节点之后,我认为你不会有延迟。
- 如何使用videojs开始播放视频时不显示字幕
- Youtube无铬播放器 - 更改大开始播放按钮
- 视频通过javascript被隐藏,但已经开始播放(自动播放模式),即使是's不可见
- 知道何时从UIWebView中开始播放YouTube视频
- HTML5 视频在开始播放另一个视频时暂停使用 Javascript
- JQuery 从第二个零开始播放 html5 视频,但如果用户暂停视频,则保留当前帧
- 如何在单击图像时开始播放视频
- HTML5 视频 - 开始播放后无法加载资源错误
- 是否有JS功能可以使Brightcove智能播放器视频开始播放
- 如何更改暂停的 html5 视频的当前时间并从该位置开始播放
- Brightcove在Div可见时开始播放
- Jplayer不会在移动设备上自动开始播放
- 如何:YouTube API 在开始播放时触发 Javascript 事件
- 是否有可能通过跳过前 100 帧来使 SWIFFY 对象开始播放
- Jassor滑块从滑块0开始播放
- iframe youtube视频开始播放后背景变暗
- 在Android HTML5播放器中开始播放所需的用户手势
- 为什么此视频获胜't不能自动开始播放
- 如何让视频在特定位置开始播放
- 加载页面后,如何让视频在特定位置开始播放