3

有没有办法告诉一首歌正在缓冲?

当我点击播放并且歌曲开始播放时,事件第一次触发,我得到了事件,但是一旦歌曲播放,如果数据没有足够快地进入,那么它“暂停”但没有事件触发。

我试过了:

audioElement.addEventListener('suspend',function (){
    console.log('suspended'); //Fires the first time song is being "buffered"
});

audioElement.addEventListener('playing',function (){
    console.log('playing'); //Fires the first time the song is played.
});

如何检查数据是否正在缓冲,以便我可以向用户指示等待的指示?

4

1 回答 1

2

这取决于您的目标浏览器及其当前 W3C 工作草案 HTML5 规范“媒体元素”部分的实现。

您可以随时在此处检查您所针对的浏览器是否支持某些事件:http: //www.w3.org/2010/05/video/mediaevents.html

否则,如果数据没有通过,那么我相信音频不会被缓冲并且stalled事件会触发。

如果数据正在通过,那么您应该能够检查suspendorprogress事件,这两个事件都应该在数据被缓冲时触发(但不一定是暂停/播放)。

如果这些事件没有触发是因为浏览器不支持它们,您总是可以networkState使用计时器检查音频元素的属性,这实际上会告诉您音频是否正在缓冲:

HTML:

<!DOCTYPE html>
<html>
    <body>
        <audio controls="controls" id="myAudio">
            <source src="http://www.w3schools.com/html5/horse.ogg" type="audio/ogg">
            Your browser does not support the audio element.
        </audio>
    </body>
</html>

Javascript:

var audioElement = document.getElementById('myAudio');

var checkNetworkStateTimer = setInterval(function () {
    console.log(audioElement.networkState); //2 indicates NETWORK_LOADING state
}, 250);

同样在 jsFiddle:http: //jsfiddle.net/3sdhj/2/

由于 jsFiddle 上的示例音频太短,您可能无法重现 a networkStateof ,但您明白了。2

如果仍然失败,我会使用流行的 HTML5 音频库,例如SoundJS,Buzzsoundmanager2(我绝不隶属于这些库)。

于 2012-10-04T11:54:23.040 回答