2009.09.06

loaderで読み込んだswf(AVM1Movie)の再生制御

詰まったのでメモ。

やりたいこと

あるところにAIRアプリ"Player"とswfファイル"Movie.swf"がありました。
"Player"で"Movie.swf"を読み込んで、再生する。
"Player"上でクリックすると"Movie.swf"のフレームを1つ進め、
右クリックすると"Movie.swf"のフレームを1つ戻したい。

問題と解決策

swfには、

  • AVM1Movie(AS2orAS1で書かれたFlash)
  • AVM2Movie(AS3で書かれたFlash)

の2種類がある。
"Movie.swf"がAVM2Movieの時は、"Player"で

Actionscript:
  1. var loader:Loader = new Loader();
  2. loader.load(new URLRequest("Movie.swf") );
  3. addChild(loader);
  4. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void{
  5. MovieClip(loader.content).gotoAndStop("hoge");
  6. });

ってすれば簡単に上記のやりたいことが達成できる。たぶん。

でも、"Movie.swf"がAVM1Movieの時はそうはいかない。
でもでも、ForcibleLoaderをつかえばできるよ!

Actionscript:
  1. var loader:Loader = Loader(addChild(new Loader()));
  2. var fLoader:ForcibleLoader = new ForcibleLoader(loader);
  3. fLoader.load(new URLRequest('Movie.swf'));
  4. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void{
  5. MovieClip(loader.content).gotoAndStop("hoge");
  6. });

これで、できるはず。...なんだけどコンパイルするとエラーがでる。

SecurityError: Error #3015: Loader.loadBytes() is not permitted to load content with executable code.

このエラーが出ないようにするために、ForcibleLoader.asを修正する。

Actionscript:
  1. loader.loadBytes(inputBytes);

を、これに書き換える。

Actionscript:
  1. var loaderContext:LoaderContext = new LoaderContext();
  2. loaderContext.allowLoadBytesCodeExecution = true; // that's it!
  3. loader.loadBytes(inputBytes, loaderContext);

that's it! これでできた!

と、思いきや、実はまだ問題がある。
それは、フレームを進めることはできるけど、戻すことができないこと。

Actionscript:
  1. stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void {
  2. MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).currentFrame+1);
  3. });

これで、"Player"をクリックしたときに"Movie.swf"が次のフレームに進むけど、

Actionscript:
  1. stage.addEventListener(MouseEvent.RIGHT_CLICK, function(e:MouseEvent):void {
  2. MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).currentFrame-1);
  3. });

これは何故か動かない。
でも、一番最後のフレームに行った後なら、フレーム戻れるよ!

Actionscript:
  1. stage.addEventListener(MouseEvent.RIGHT_CLICK, function(e:MouseEvent):void {
  2. var tmp:int = MovieClip(loader.content).currentFrame;
  3. MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).framesLoaded);
  4. MovieClip(loader.content).gotoAndStop(tmp-1);
  5. });

これで、"Player"を右クリックしたときに"Movie.swf"が1つ前のフレームに戻るようになった。無理やりだけど。

参考URL

yossy/ForcibleLoader - Spark project
AVM1Movie Controller in Flex ? Flex User
とりあえずはswfファイルの制御 - ichiro_jの日記
Markus Raab - All I don’t know. ? Blog Archive ? Select and access local SWF files within an AIR application
FLASH-JP.COM - フォーラム
神風記: ロードしたSWFのタイムラインを制御する。

4 Responses to “loaderで読み込んだswf(AVM1Movie)の再生制御”

  • 初めましてー、鹿と申します。

    まさにこの「AIRでAVM1Movieを読み込んで制御」がしたかったので、
    この記事を見て、実践できたので非常に感激&感謝しております。
    (AVM1は制御無理じゃろと半ば諦めてたので)

    ・気になった点がありましたので、メモさせて下さい。
     使用したのは、Flash CS4にてAIR1.5であります。

     記事にありますように作成しましたところ、
     「ForcibleLoader.as のLoaderContextが 『型が見つからないか、コンパイル時定数ではありません』」とか文句言われたので、
     ForcibleLoader.as の40行目らへんに
     「import flash.system.LoaderContext;」を書き足したら無事に動きました。

     (それを足すのが当たり前でしたら、素人ちっく追記でスミマセン。m(_ _)m)

    2010.05.13, コメント by 野生の鹿
  • 鹿さんはじめまして!
    お役に立てたみたいで、良かったです。

    importについて書くの忘れてました。追記ありがとうございます。

    2010.05.13, コメント by osamX
  • [...] osamXさん(フラスコ)の 記事『loaderで読み込んだswf(AVM1Movie)の再生制御』に救われました! [...]

  • [...] 「SWFにgotoAndPlay()を発行したが、反応がない」 osamXさん(フラスコ)の 記事『loaderで読み込んだswf(AVM1Movie)の再生制御』に救われました! [...]

コメントをどうぞ。

TrackBack URI :