Domanda

Sto scherzando con la nuova API di YouTube as3 ma mi sono bloccato. Questo è quanto sono arrivato (dall'esaminare il loro codice di esempio).

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);
    }
}

Non so davvero quale sia il prossimo passo. Non ricevo errori e non viene tracciato nulla. Sono abbastanza sicuro che i miei eventi non siano implementati correttamente.

Aggiornamento: Ho seguito la risposta di Amarghosh e l'ho fatto invece:

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);
}

Ora gli eventi onPlayerReady e onStateChange si attivano ma ottengo errori. Quando si traccia l'oggetto (e) .Data ottengo questo errore

Errore di riferimento: errore n. 1069: i dati della proprietà non sono stati trovati per com.google.youtube.event.ExternalEvent e non esiste un valore standard. (tradotto dallo svedese) Quando si cambia in Object (e.target) .Data traccia "non definito" e Object (e.target) traccia [oggetto SwfProxy].

Se provo player.loadVideoById (" uad17d5hR5s "); ottengo questo errore:

1061: chiamata a un metodo eventualmente non definito loadVideoById tramite un riferimento con tipo statico flash.display: Sprite.

È stato utile?

Soluzione

scusa per tutta la confusione della biblioteca, penso di avere la risposta al tuo altro errore però. Quando si esegue questo Sprite (loader.content) si 'forza' il cast del giocatore in modo che sia uno sprite, perché si desidera che i metodi dell'API mi consiglia di utilizzare un semplice oggetto vecchio, perché non lo farà lamentarsi dei metodi non tipizzati:

// 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);
}

Altri suggerimenti

Se la variabile player dovrebbe contenere il player di YouTube caricato, cambia il suo tipo da Object a qualcosa di più solido come Sprite .

private var player:Sprite;

Ora, non conosco l'API di YouTube, ma c'è un problema nel tuo metodo onLoaderInit . Dovresti aggiungere quegli ascoltatori al contenuto caricato invece del suo oggetto LoaderInfo . LoaderInfo invia eventi relativi al processo di caricamento - non è rilevante una volta che il caricamento ha esito positivo. Gli eventi menzionati in tali chiamate verrebbero inviati dal contenuto caricato. Cambia il metodo in:

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);
}

relativamente recentemente youtube ha rilasciato una libreria wrapper per il suo lettore chromeless. Dovresti assolutamente utilizzare questa versione (puoi scriverla di nuovo da solo, ma reinventando la ruota), dai un'occhiata al tutorial / esempio in questa pagina

Wrapper ActionScript 3.0 per Chromeless Player

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top