2009-10-22 12 views
0

Je suis en train de goofing avec la nouvelle API YouTube as3, mais je suis coincé. C'est jusqu'où j'ai obtenu (en regardant leur code d'échantillon).youtube lecteur chromeless as3

http://pastie.org/656088

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 ce que l'étape suivante est. Je n'ai pas d'erreurs et rien n'est tracé. Je suis à peu près sûr que mes événements ne sont pas implémentés correctement.

Mise à jour: J'ai suivi Amarghosh a répondu et a fait ceci:

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, le onPlayerReady et les événements OnStateChange feux mais je reçois des erreurs. Lors de la recherche d'objets (e) .Data je reçois cette erreur

ReferenceError: Error #1069: the property Data was not found for com.google.youtube.event.ExternalEvent and there is no standard value. (stranslated du suédois) Lors de la modification de l'objet (e.target) .Data il trace "undefined" et l'objet (e.target) traces objet [ SwfProxy].

Si j'essaie player.loadVideoById("uad17d5hR5s"); je reçois cette erreur:

1061: Call to a possibly undefined method loadVideoById through a reference with static type flash.display:Sprite.

Répondre

0

désolé pour la confusion bibliothèque, je pense avoir La réponse à votre autre erreur cependant. Lorsque vous faites cela Sprite(loader.content) vous « force » jeté le joueur à être un sprite, parce que vous voulez des méthodes de l'api Je recommande d'utiliser un objet bon vieux, car il ne se plaindra pas des 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); 
} 
+0

C'était tout! Merci! –

0

Si la variable player est censé tenir le lecteur youtube chargé, changer son type de Object à quelque chose de plus solide comme Sprite.

private var player:Sprite; 

Maintenant, je ne sais pas l'API YouTube, mais il y a un problème dans votre méthode onLoaderInit. Vous devriez ajouter ces écouteurs au contenu chargé au lieu de son objet LoaderInfo. LoaderInfo envoie 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 expédiés par le contenu chargé. Changer 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); 
} 
+0

Grande ! Un peu plus près. J'ai mis à jour mon message. Merci beaucoup. –

+0

C'est une bonne idée de poser une nouvelle question une fois que votre problème (que vous avez posé dans la question) est résolu, plutôt que de continuer à discuter de tous les problèmes dans le même fil. – Amarghosh

+0

Il semble que le problème est lié à youtubeapi - demandez-le comme une autre question pour obtenir plus d'exposition. – Amarghosh

0

relativement récemment, youtube a publié une bibliothèque de wrapper pour leur lecteur chromeless. Vous devez definitly utiliser cette version (vous pouvez écrire vous-même à nouveau, mais c'est de réinventer la roue), consultez le tutoriel/exemple sur cette page

ActionScript 3.0 Wrapper for Chromeless Player

+0

Ce wrapper a été publié il y a un certain temps et non sur youtube. Le wrapper est pour l'API as2 et je veux essayer l'API as3. –

+0

Je suis sûr que c'est vrai, mais le lien ci-dessus est pour la bibliothèque de l'encapsuleur AS3, la bibliothèque qui est pour ActionScript 3.0, les événements strictement tapés et tout. – enzuguri

+0

Et je suis sûr que le wrapper a des événements strictement typés et tout, mais il utilise toujours l'ancienne API obsolète. –

Questions connexes