Вопрос

Я возился с новым API YouTube 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);
    }
}

Я действительно не знаю, каков будет следующий шаг.У меня нет ошибок, и ничего не отслеживается.Я почти уверен, что мои события реализованы неправильно.

Обновлять:Я последовал ответу Амаргоша и вместо этого сделал следующее:

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

Теперь события onPlayerReady и onStateChange срабатывают, но я получаю ошибки.При трассировке Object(e).Data я получаю эту ошибку

ReferenceError: Error #1069: the property Data was not found for com.google.youtube.event.ExternalEvent and there is no standard value.(Установлен из шведского) при переходе на объект (E.Target). Data Это прослеживает «неопределенные» и объектные (e.target) трассы [Object swfproxy].

если я попробую player.loadVideoById("uad17d5hR5s"); я получаю эту ошибку:

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

Это было полезно?

Решение

извините за всю путаницу с библиотекой, но думаю, у меня есть ответ на другую вашу ошибку.Когда ты это сделаешь Sprite(loader.content) вы «принуждаете» превратить игрока в спрайт, потому что вам нужны методы API. Я бы рекомендовал использовать простой старый объект, потому что он не будет жаловаться на нетипизированные методы:

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

Другие советы

Если переменная player должен содержать загруженный проигрыватель YouTube, измените его тип с Object к чему-то более твердому, например Sprite.

private var player:Sprite;

Я не знаю API YouTube, но у вас проблема. onLoaderInit метод.Вам следует добавлять эти прослушиватели к загруженному контенту вместо его LoaderInfo объект. LoaderInfo отправляет события, связанные с процессом загрузки — это не имеет значения, если загрузка прошла успешно.События, упомянутые в этих вызовах, будут отправляться загруженным содержимым.Измените метод на:

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

сравнительно недавно YouTube выпустил библиотеку-обертку для своего безхромного плеера.Вам обязательно следует использовать эту версию (вы можете написать ее заново самостоятельно, но это значит изобретать велосипед), ознакомьтесь с руководством/примером на этой странице.

Оболочка ActionScript 3.0 для Chromeless Player

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top