2009-10-22 5 views
0

Я работаю с новым API-интерфейсом youtube as3, но застрял. Это , насколько я получил (смотрю на примерный код).youtube chromeless as3 player

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, но я получаю ошибки. При отслеживании объекта (е) .data я получаю эту ошибку

ReferenceError: Error #1069: the property Data was not found for com.google.youtube.event.ExternalEvent and there is no standard value. (stranslated от Swedish) При переходе объекта (e.target) .data это следы "неопределенный" и Object (e.target) следы [объект SwfProxy].

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

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

ответ

0

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

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

Вот и все! Благодаря! –

0

Если переменная 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); 
} 
+0

Великого ! На один шаг ближе. Я обновил свой пост. Большое спасибо. –

+0

Это хорошая идея задать новый вопрос, как только ваша проблема (которую вы задали в вопросе) будет решена, вместо того, чтобы продолжать обсуждать все проблемы в одном потоке. – Amarghosh

+0

Кажется, что проблема связана с youtubeapi - задайте ее как еще один вопрос, чтобы получить больше воздействия. – Amarghosh

0

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

ActionScript 3.0 Wrapper for Chromeless Player

+0

Эта оболочка была выпущена довольно давно, а не на youtube. Оболочка для API as2, и я хочу попробовать API as3. –

+0

Я уверен, что это правда, но ссылка выше для библиотеки обтекателей AS3, библиотеки, предназначенной для ActionScript 3.0, строго типизированных событий и всего. – enzuguri

+0

И я уверен, что обертка имеет строго типизированные события и все, но она по-прежнему использует старый устаревший API. –

Смежные вопросы