Pregunta

Estoy jugando con la nueva API as3 de YouTube, pero me quedé atascado. Esto es qué tan lejos llegué (de mirar su código de muestra).

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

Realmente no sé cuál es el siguiente paso. No me sale ningún error y nada se remonta. Estoy bastante seguro de que mis eventos no se han implementado correctamente.

Actualización: Seguí la respuesta de Amarghosh e hice esto en su lugar:

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

Ahora se activan los eventos onPlayerReady y onStateChange pero me aparecen errores. Al rastrear el objeto (e) .Data me aparece este error

ReferenceError: Error # 1069: la propiedad No se encontraron datos para com.google.youtube.event.ExternalEvent y no hay un valor estándar. (traducido del sueco) Al cambiar a Objeto (e.target) .Data se rastrea " undefined " y el objeto (e.target) traza [objeto SwfProxy].

Si intento player.loadVideoById (" uad17d5hR5s "); me aparece este error:

1061: llame a un método loadVideoById posiblemente no definido a través de una referencia con tipo estático flash.display: Sprite.

¿Fue útil?

Solución

perdón por toda la confusión de la biblioteca, creo que tengo la respuesta a tu otro error. Cuando haces esto, Sprite (loader.content) 'forzasas' al jugador para que sea un sprite, porque quieres métodos de la api. Recomendaría usar un objeto viejo y sencillo, porque no quejarse de métodos sin tipo:

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

Otros consejos

Si se supone que la variable player tiene el reproductor de YouTube cargado, cambia su tipo de Object a algo más sólido como Sprite .

private var player:Sprite;

Ahora, no conozco la API de youtube, pero hay un problema en el método onLoaderInit . Debe agregar esos escuchas al contenido cargado en lugar de a su objeto LoaderInfo . LoaderInfo distribuye eventos relacionados con el proceso de carga; no es relevante una vez que la carga se haya realizado correctamente. Los eventos mencionados en esas llamadas serían enviados por el contenido cargado. Cambie el método a:

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

Hace relativamente poco tiempo, YouTube lanzó una biblioteca de envoltorios para su reproductor sin cromo. Definitivamente debería usar esta versión (podría escribirla de nuevo usted mismo, pero eso es reinventar la rueda), consulte el tutorial / ejemplo en esta página

Envoltorio ActionScript 3.0 para Chromeless Player

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top