SoundCloud JavaScript API v.3 SC.stream错误

时间:2015-10-28 16:19:18

标签: javascript soundcloud

我正在将我的代码从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慢;第二个奇怪的事情是,事件不会按照我期望的顺序解雇:

  1. play
  2. buffer-start
  3. play-start
  4. buffer-end
  5. finish
  6. 有时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。

2 个答案:

答案 0 :(得分:2)

您可以通过设置播放器选项属性来强制使用http协议: player.options.protocols = [' http'];

答案 1 :(得分:0)

我在相同的事情上尝试了很长一段时间。玩家只是没有削减它,我无法让它工作。我看着Soundnode正在这样做,因为他们能够流式传输每首歌曲,而且它是<audio>标签。使用src设置其autoplay属性即可。设置元素事件的绑定,你就可以了。