0

我正在玩弄新的 youtube as3 API,但被卡住了。这就是我得到的(通过查看他们的示例代码)。

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

我真的不知道下一步是什么。我没有收到任何错误,也没有任何东西被追踪。我很确定我的事件没有正确实施。

更新:我按照 Amarghosh 的回答做了这个:

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. (从瑞典语翻译)当更改为 Object(e.target).Data 时,它会跟踪“未定义”,而 Object(e.target) 会跟踪 [object SwfProxy]。

如果我尝试player.loadVideoById("uad17d5hR5s");我会收到此错误:

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

4

3 回答 3

0

如果该变量player应该保存已加载的 youtube 播放器,请将其类型从更改Object为更可靠的类型,例如Sprite.

private var player:Sprite;

现在,我不知道 youtube API,但你的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);
}
于 2009-10-23T05:27:53.463 回答
0

对不起所有图书馆的混乱,我想我有你的其他错误的答案。当您这样做时,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);
}
于 2009-10-25T22:31:14.443 回答
0

最近 youtube 为他们的 chromeless 播放器发布了一个包装库。你应该绝对使用这个版本(你可以自己再写一次,但那是重新发明轮子),查看本页上的教程/示例

用于 Chromeless 播放器的 ActionScript 3.0 包装器

于 2009-10-23T18:44:36.077 回答