lecteur y3 sans chrome sur youtube
-
05-07-2019 - |
Question
Je rigole avec la nouvelle API youtube as3 mais je suis resté bloqué. C'est à quelle distance je suis (de regarder leur exemple de code).
public class Main extends Sprite
{
Security.allowDomain("*");
private var player:Object;
private var loader:Loader;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit);
loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"));
}
private function onLoaderInit(e:Event):void
{
addChild(loader);
loader.contentLoaderInfo.addEventListener("onReady", onPlayerReady);
loader.contentLoaderInfo.addEventListener("onError", onPlayerError);
loader.contentLoaderInfo.addEventListener("onStateChange", onPlayerStateChange);
loader.contentLoaderInfo.addEventListener("onPlayerQualityChange", onVideoPlaybackQualityChange);
}
private function onPlayerReady(e:Event):void
{
trace("Player ready: " + Object(e).Data);
}
private function onPlayerError(e:Event):void
{
trace("Player error: " + Object(e).Data);
}
private function onPlayerStateChange(e:Event):void
{
trace("Player state: " + Object(e).Data);
}
private function onVideoPlaybackQualityChange(e:Event):void
{
trace("Video quality: " + Object(e).Data);
}
}
Je ne sais pas vraiment quelle est la prochaine étape. Je ne reçois aucune erreur et rien ne se trace. Je suis à peu près sûr que mes événements ne sont pas implémentés correctement.
Mise à jour: J'ai suivi la réponse d'Amarghosh et je l'ai fait à la place:
private function onLoaderInit(e:Event):void
{
player = Sprite(loader.content);
addChild(player);
player.addEventListener("onReady", onPlayerReady);
player.addEventListener("onError", onPlayerError);
player.addEventListener("onStateChange", onPlayerStateChange);
player.addEventListener("onPlayerQualityChange", onVideoPlaybackQualityChange);
}
Maintenant, les événements onPlayerReady et onStateChange se déclenchent, mais des erreurs se produisent. Lors du traçage de l'objet (e) .Data, j'obtiens cette erreur
ReferenceError: Erreur # 1069: la propriété Data n'a pas été trouvée pour com.google.youtube.event.ExternalEvent et il n'y a pas de valeur standard.
(traduit du suédois)
Lorsque vous passez à Object (e.target) .Data, il trace "" non défini". et traces d'objet (e.target) [objet SwfProxy].
Si j'essaie player.loadVideoById ("uad17d5hR5s");
j'obtiens cette erreur:
1061: Appel de la méthode loadVideoById éventuellement indéfinie via une référence de type statique flash.display: Sprite.
La solution
désolé pour toute la confusion de la bibliothèque, je pense cependant avoir la réponse à votre autre erreur. Lorsque vous faites cela, Sprite (loader.content)
, vous forcez le joueur à être transformé en sprite, car vous souhaitez utiliser les méthodes de l'API, je vous recommanderais d'utiliser un ancien objet se plaindre de méthodes non typées:
// No particluar type
var player:Object;
private function onLoaderInit(e:Event):void
{
player = loader.content;
addChild(player as DisplayObject);
var dispatcher:IEventDispatcher = player as IEventDispatcher;
dispatcher.addEventListener("onReady", onPlayerReady);
dispatcher.addEventListener("onError", onPlayerError);
dispatcher.addEventListener("onStateChange", onPlayerStateChange);
dispatcher.addEventListener("onPlayerQualityChange", onVideoPlaybackQualityChange);
}
Autres conseils
Si la variable lecteur
est censée contenir le lecteur youtube chargé, changez son type de Objet
à quelque chose de plus solide, tel que Sprite
.
private var player:Sprite;
Maintenant, je ne connais pas l'API youtube, mais il y a un problème dans votre méthode onLoaderInit
. Vous devriez ajouter ces écouteurs au contenu chargé à la place de son objet LoaderInfo
. LoaderInfo
distribue les événements liés au processus de chargement - ce n'est pas pertinent une fois le chargement réussi. Les événements mentionnés dans ces appels seraient envoyés par le contenu chargé. Changez la méthode pour:
private function onLoaderInit(e:Event):void
{
player = Sprite(loader.content);
addChild(player);
player.addEventListener("onReady", onPlayerReady);
player.addEventListener("onError", onPlayerError);
player.addEventListener("onStateChange", onPlayerStateChange);
player.addEventListener("onPlayerQualityChange", onVideoPlaybackQualityChange);
}
relativement récemment, YouTube a publié une bibliothèque d’emballages pour son lecteur sans chrome. Vous devriez définitivement utiliser cette version (vous pouvez la réécrire vous-même, mais c'est réinventer la roue), consultez le tutoriel / exemple sur cette page