youtubeクロムレスas3プレーヤー
-
05-07-2019 - |
質問
新しいyoutube as3 APIをいじくり回していますが、行き詰まりました。これは (サンプルコードを見て)どれくらいの距離にあるか。
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:エラー#1069:com.google.youtube.event.ExternalEventのプロパティデータが見つかりませんでした。標準値はありません。
(スウェーデン語から翻訳)
Object(e.target).Dataに変更すると、「未定義」をトレースします。およびObject(e.target)トレース[object SwfProxy]。
player.loadVideoById(" uad17d5hR5s");を試してみると
このエラーが発生します:
1061:静的型flash.display:Spriteの参照を介して未定義の可能性があるメソッドloadVideoByIdを呼び出します。
解決
すべてのライブラリの混乱については申し訳ありませんが、他のエラーにも答えがあると思います。この 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;
現在、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);
}
比較的最近、youtubeはクロムレスプレーヤー用のラッパーライブラリをリリースしました。このバージョンを明確に使用する必要があります(自分でもう一度書くことができますが、それは車輪を再発明します)。このページのチュートリアル/例を参照してください