我正在将我的代码从Soundcloud Javascript API v.1升级到最新版本。 我已经能够迁移90%的代码,但在尝试流式传输某些轨道时,我有一些奇怪的行为。 我想我已经为“播放器”对象实现了所有必需的监听器,但是我无法理解问题所在。 以下是我的代码片段:
try {
SC.stream( "/tracks/" + playlist[ now_playing ].sndc_id ).then(
function (player) {
sound_object = player;
sound_object.on(
'state-change',
function() {
console.log('state-change', this.controller._state);
}
).on(
'play',
function() {
console.log('play');
}
).on(
'play-start',
function() {
console.log('playback started');
playing = true;
show();
play();
updateInfo();
}
).on(
'buffering_start',
function() {
console.log('buffering starts');
}
).on(
'buffering_end',
function() {
console.log('buffering ends');
}
).on(
'time',
function() {
console.log( this.currentTime() );
updateProgress(this.currentTime(), playlist[ now_playing ].duration);
}
).on(
'finish',
function() {
console.log('finish');
loadNext();
}
).on(
'pause',
function() {
console.log('pause');
}
).on(
'play-resume',
function() {
console.log('play-resume');
}
).on(
'geo_blocked',
function() {
console.log('geo_blocked');
loadNext();
}
).on(
'audio_error',
function() {
console.log('audio_error');
sendErrorReport(playlist[ now_playing ].id);
loadNext();
}
).on(
'no_streams',
function() {
console.log('no_streams');
sendErrorReport(playlist[ now_playing ].id);
loadNext();
}
).on(
'no_protocol',
function() {
console.log('no_protocol');
loadNext();
}
).on(
'no_connection',
function() {
console.log('no_connection');
loadNext();
}
);
sound_object.play();
},
function( e ) {
console.log( e );
loadNext();
}
);
} catch(e) {
console.log( e );
loadNext();
}
playlist
数组包含有效轨道ID列表。
我所做的是:
我注意到的第一件事是这个新的API比以前的API慢;第二个奇怪的事情是,事件不会按照我期望的顺序解雇:
play
buffer-start
play-start
buffer-end
finish
有时play-start
会在buffer-start
之前触发,当发生这种情况时,客户端会冻结。
第二个问题是我不时从SoundCloud JS文件中获取的Javascript错误,并且它没有被try {} catch {}表达式捕获,这是我的JS控制台的快照:
play (index):692
(5x) state-change initialize (index):711
(8x) buffering starts
(3x) sdk-3.0.0.js:12
Uncaught Error: Error: An invalid exception was thrown.
i.setVolume @ sdk-3.0.0.js:12
i.createAudioPlayer @ sdk-3.0.0.js:8
o @ sdk-3.0.0.js:13
(anonymous function) @ sdk-3.0.0.js:13
(anonymous function) @ sdk-3.0.0.js:18
p @ sdk-3.0.0.js:13
d.fireWith @ sdk-3.0.0.js:13
d.fire @ sdk-3.0.0.js:13
(anonymous function) @ sdk-3.0.0.js:13
(anonymous function) @ sdk-3.0.0.js:18
p @ sdk-3.0.0.js:13
d.fireWith @ sdk-3.0.0.js:13
d.fire @ sdk-3.0.0.js:13
u.onreadystatechange @ sdk-3.0.0.js:13
由于缩小了SDK文件,我很难找到问题所在。
我想知道是否有人已经遇到过这些问题,以及是否存在解决方案。我注意到错误事件永远不会被调用,即使轨道实际上返回一个错误(就像在安塞拉中你看到一个404错误的轨道),这对我来说也很好奇。
提前谢谢你,S。
答案 0 :(得分:2)
您可以通过设置播放器选项属性来强制使用http协议: player.options.protocols = [' http'];
答案 1 :(得分:0)
我在相同的事情上尝试了很长一段时间。玩家只是没有削减它,我无法让它工作。我看着Soundnode正在这样做,因为他们能够流式传输每首歌曲,而且它是<audio>
标签。使用src
设置其autoplay
属性即可。设置元素事件的绑定,你就可以了。