youtube chromeless as3 player
-
05-07-2019 - |
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).
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.
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