SoundManager 的 100% HTML5 模式卡在 "stalled"
SoundManager on 100% HTML5 mode stuck on "stalled"
在我的智能电视应用中,我通过跨域请求使用 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();
(其中 whileplaying
、onfinish
和 onstop
参数都调用一个函数来更改 css and/or 的 类 html 文档中的元素。)
我的问题:
- 有没有办法事先知道 SMsound 对象不会播放?
- 说我在加载它之前无法知道它会永远 "loadstart" 和 "stall",有没有办法知道它在加载之后?
我是问这个是因为有些曲目会在很长一段时间后加载和播放。
我可以建议一个可能有用的解决方法。
var mySound = soundManager.createSound({..});
mySound.load();
setTimeout(function() {
if (mySound.readyState == 1) {
// this object is probably stalled
}
},5500);
这是有效的,因为在 html5 中,与闪存不同,readystate 属性 从“0”(未初始化 - 尚未加载)跳转到“3” '(加载)几乎瞬间,跳过'1'(初始化 - 开始加载),因为如果声音开始缓冲它可以在 html5 中播放,因此 readystate returns 3...
在 html5 上,永久(或长时间)停滞的声音将在 load() 尝试后很长时间内具有 readystate = 1。
在那之后 - 你可以 replace/remove/skip 错误的曲目或其他任何东西。
- 注意 - 5500 毫秒应该足够长,您可以尝试一下,看看什么是您平台的最佳超时时间。
希望对您有所帮助。
在我的智能电视应用中,我通过跨域请求使用 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();
(其中 whileplaying
、onfinish
和 onstop
参数都调用一个函数来更改 css and/or 的 类 html 文档中的元素。)
我的问题:
- 有没有办法事先知道 SMsound 对象不会播放?
- 说我在加载它之前无法知道它会永远 "loadstart" 和 "stall",有没有办法知道它在加载之后?
我是问这个是因为有些曲目会在很长一段时间后加载和播放。
我可以建议一个可能有用的解决方法。
var mySound = soundManager.createSound({..});
mySound.load();
setTimeout(function() {
if (mySound.readyState == 1) {
// this object is probably stalled
}
},5500);
这是有效的,因为在 html5 中,与闪存不同,readystate 属性 从“0”(未初始化 - 尚未加载)跳转到“3” '(加载)几乎瞬间,跳过'1'(初始化 - 开始加载),因为如果声音开始缓冲它可以在 html5 中播放,因此 readystate returns 3...
在 html5 上,永久(或长时间)停滞的声音将在 load() 尝试后很长时间内具有 readystate = 1。
在那之后 - 你可以 replace/remove/skip 错误的曲目或其他任何东西。
- 注意 - 5500 毫秒应该足够长,您可以尝试一下,看看什么是您平台的最佳超时时间。
希望对您有所帮助。