2015-06-23 15 views
5

Ich versuche, das onfinish Ereignis für die Soundcloud Javascript SDK Stream-Methode zu verwenden. Ich habe den folgenden Code, der funktioniert, außer das Onfinish-Ereignis wird nie ausgelöst. Irgendwelche Ideen wären sehr hilfreich.Soundcloud Javascript SDK 2.0 - Stream onfinish Ereignis führt nicht

var soundPlayer; 
var smOptions = { 
    useHTML5Audio: true, 
    preferFlash: false, 
    onfinish: function() { 
     console.log('Finished playing'); 
    } 
}; 

SC.initialize({ 
    client_id: "..." 
}); 

SC.stream("/tracks/12345", smOptions, function(sound) { 
    soundPlayer = sound; 
}); 

Vielen Dank im Voraus!

Update:

Da OnFinish nicht funktioniert Ich bin mit dem getState() -Methode auf dem Soundplayer-Objekt, das in SC.stream() zurückgegeben wird. Glücklicherweise gibt es einen eindeutigen Zustand, der "beendet" heißt, wenn der Stream abgeschlossen ist. Dies ist, was ich umgesetzt haben:

setInterval(function() { 
    if (soundPlayer != null && soundPlayer.getState() == "ended") { 
     soundPlayer.play(); 
    } 
}, 250); 

ich darüber nicht glücklich bin, aber es gibt mir die erfahrenen Wünsche offen und erfüllt die Anforderungen. Ich hoffe wirklich, dass jemand dazu beitragen kann, etwas darüber aufzuklären, warum die dokumentierte Onfinish-Methode nicht feuert.

Wer hat irgendwelche Ideen?

Antwort

2

Hier ist eine Abhilfe mit Rückrufen anstelle von Polling. Es funktioniert, indem es auf das dynamische html5 audio player Element selbst & das Registrieren eines nativen Ereignisses abzielt. Ich erwarte nicht, dass es in Fallback-Modi funktioniert, aber das Erzwingen von html5 beendet möglicherweise die Lösung, bis das SDK v2 ein Soundobjekt zurückgibt.

var soundPlayer; 
var smOptions = { 
    useHTML5Audio: true, 
    preferFlash: false 
}; 

SC.initialize({ 
    client_id: "..." 
}); 

SC.stream("/tracks/12345", smOptions, function(sound) { 
    soundPlayer = sound; 
    html5Audio = sound._player._html5Audio; 
    html5Audio.addEventListener('ended', function(){ console.log('event fired: ended'); }); 
}); 
+0

Danke, das funktioniert gut. Irgendeine Idee, warum die Stream-Methode kein Sound-Objekt im Callback zurückgibt, wie es in der Dokumentation heißt? https://developers.soundcloud.com/docs/api/sdks#streaming – Mike

+0

Kein Problem. Ich habe keine weiteren Informationen zum SDK, aber ich werde diesen Thread aktualisieren, wenn ich mehr darüber weiß. Bitte mach das gleiche, wenn du möchtest. –

+0

Dies funktioniert für SDK 2, aber seit SDK 3 veröffentlicht ist (Oktober '15) funktioniert es nicht mehr. Irgendwelche Gedanken? –

0

Ich habe das gleiche Problem, ich kann nicht scheinen, einige der Callbacks zu schießen. Hier ist ein triviales Beispiel, abgesehen von Callbacks. (Dies soll ein Kommentar, anstatt eine Antwort sein, aber ich habe nicht den SO Ruf, dies zu tun.)

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
<h1>Sound Cloud API callback test</h1> 
<script src="//connect.soundcloud.com/sdk-2.0.0.js"></script> 
<script type="text/javascript"> 
    SC.initialize({ 
     client_id: "YOUR_CLIENT_ID" 
    }); 

    SC.stream(
      '/tracks/293', 
      { 
       onload: function() { console.log("Does not fire."); }, 
       onplay: function() { console.log("Does not fire."); }, 
       onfinish: function() { console.log("Does not fire."); } 
      }, 
      function(sound) { sound.play(); }); 
</script> 
</body> 
</html> 
+0

Vielen Dank für dieses Posting, gut zu wissen, dass ich nicht verrückt zu werden. :) Hoffentlich können wir hier vom Soundcloud-Team oder jemandem, der mit diesem Thema vertraut ist. Ich kann nicht finden, dass andere dieses Problem haben. Und der ganze Code, den ich auf SO sehe, benutzt onfinish, wie ich es implementiert habe. Daumen drücken! – Mike

+0

Ich kann zumindest bestätigen, dass wenn ich verrückt bin, auch ich bin! Vielen Dank für die Bereitstellung dieser Problemumgehung. Hoffentlich werden wir es nicht dauerhaft brauchen, aber es ist schön zu wissen, dass es da ist. – Catcher

1

Das funktioniert perfekt mit dem SDK Version 3

SC.stream('/tracks/293', function(player) { 
    player.on('finish', function() { 
    stopPlayer(); 
    }); 
}); 
+0

Gibt Version 3 SDK kein Promise-Objekt zurück? Ich glaube nicht, dass diese Lösung funktioniert. Ich habe Version 3.1.2 getestet und der Rückruf wird nie ausgelöst. '.then (fn)' wird stattdessen verwendet. –

Verwandte Themen