SoundManager在100%HTML5模式下卡在“停滞”状态

时间:2015-06-13 19:25:44

标签: javascript html5 soundcloud samsung-smart-tv soundmanager2

在我的智能电视应用中,我正在使用SoundCloud API,通过跨域请求 - $.getJSON()等。 该应用程序还在100%HTML5模式(无Flash)上使用SoundManager2 API来加载从SoundCloud检索到的.stream_url的曲目。尝试播放加载的曲目时问题就开始了。假设该应用程序加载了10首曲目,其中一些将无法播放 我注意到日志说明:

0040  sound0: play(): Loading - attempting to play...
0041  sound0: abort
0042  sound0: waiting
0043  sound0: loadstart
0044  sound0: stalled 

它永远存在的地方。问题总是发生在相同的轨道上,而其他轨道是可流动的,可播放的,显示日志:

0078  sound2: durationchange (191190)
0079  sound2: loadedmetadata
0080  sound2: stalled
0081  sound2: suspend
0082  sound2: loadeddata
0083  sound2: canplay
0084  sound2: onload()
0085  sound2: playing ♫

用于创建声音对象并播放它的代码:

        SoundObject = soundManager.createSound({    //  load the current track
            url: "https://api.soundcloud.com/tracks/" + TrackIDs[elements][index-1] + "/stream?client_id=f430822ab78177a5cfb94d572d9036a2",
            volume: 100,
            autoLoad:    true, 
            //autoPlay:      true,
            //stream:        true,
            whileplaying:function(){currentPosition=SoundObject.position;barWhilePlaying(elements, index, currentPosition);},                         
            onfinish:    function(){barOnFinish(elements, index);},                       
            onstop:      function(){barOnStop(elements, index);},
        });
        SoundObject.play();

(其中whileplayingonfinishonstop参数都调用一个函数来更改html文档中的css和/或元素类。)
<登记/> 我的问题:

  1. 有没有办法事先知道SMsound对象不会播放?
  2. 说我在加载之前无法知道它会永远“加载启动”和“失速”,有没有办法知道它被加载后?我问这个因为一些轨道将在很长一段时间后加载和播放。

1 个答案:

答案 0 :(得分:2)

我可以建议一个可能有用的解决办法。

var mySound = soundManager.createSound({..});  
mySound.load();  
setTimeout(function() {
    if (mySound.readyState == 1) {
        // this object is probably stalled
        }
},5500);

这在html5中起作用,与flash不同, readystate 属性从&#39; 0&#39;(未初始化 - 尚未加载)跳转到&#39; 3&#39;(已加载) )几乎是瞬间,跳过&#39; 1&#39;(初始化 - 开始加载),如果声音开始缓冲它可以在html5中播放,因此 readystate 返回3 ... <登记/> 在html5上,在load()尝试之后,永久(或持续很长时间)停滞的声音将具有 readystate = 1

之后 - 你可以替换/删除/跳过错误的轨道或其他什么。

  • 注意 - 5500毫秒应该足够长,你可以玩它,看看你的平台最好的timeOut。

希望这对你有所帮助。