1

プロジェクトで SWF ファイルを再生する必要があります。これらの SWF ファイルにはバックグラウンド ミュージックが含まれています。Flash 内のこの音楽のサウンド シンク オプションが「ストリーム」に設定されています。これは、Flash ムービーを一時停止すると音楽も一時停止するようにするためです。

これらの SWF ファイルをロードしているときに問題が発生しました。このために、SWFLoader を使用しています。

ロードすると、SWF のオーディオは既に再生されていますが、ムービーのビジュアルが一定時間表示されません。接続が遅いほど、映画のビジュアルが表示されるまでに時間がかかります。オーディオとビジュアルは同期していますが、フラッシュ ムービーの最初のフレームが表示されません。

これを解決するために、eventListener を追加して、再生を開始する前にムービーが完全に読み込まれるようにしました。ただし、これを行うと (以下のコード)、ほんの一瞬音楽が再生されてから停止し、ムービーが完全に読み込まれると再開されます。

この問題を解決する最善の方法は何ですか? 私は ProgressEvent.PROGRESS イベントリスナーで正しい軌道に乗っていますか?

いくつかのコード:

private function loadSWF():void
{
    swfLoader.source = source;
    swfLoader.addEventListener(ProgressEvent.PROGRESS, loadProgress);
    swfLoader.addEventListener(Event.COMPLETE, startSWF);
    swfLoader.load();
    var soundTransform:SoundTransform = new SoundTransform(0);
    swfLoader.soundTransform = soundTransform;
}

private function loadProgress(event:ProgressEvent):void
{
    applicationModel.addToConsoleOutput("SWFPlayer.loadProgress(): " + event.bytesLoaded + " of " + event.bytesTotal + "bytes loaded");
    if (MovieClip(swfLoader.content) && event.bytesLoaded < event.bytesTotal)
    {
        MovieClip(swfLoader.content).gotoAndStop(0);
        var soundTransform:SoundTransform = new SoundTransform(0);
        swfLoader.soundTransform = soundTransform;
    }
}

private function startSWF(event:Event):void
{
    swfLoader.removeEventListener(ProgressEvent.PROGRESS, loadProgress);
    swfLoader.removeEventListener(Event.COMPLETE, startSWF);
    dispatchEvent(new Event("loadComplete", true));

    var soundTransform:SoundTransform = new SoundTransform(volume);
    swfLoader.soundTransform = soundTransform;

    cardMovieClip = MovieClip(swfLoader.content);
    cardMovieClip.addEventListener(Event.ENTER_FRAME, endSWFHandler);
    cardMovieClip.gotoAndPlay(0);
}
4

1 に答える 1

3

SWFファイルはストリーミングされるため、ファイル全体をロードしなくても再生を開始できます。

1)ロードされたソースファイルに最初のフレームにstop()を追加して再生を回避し、ロードが完了したら、ムービーを作成するフレームにロードされたムービーにgotoAndPlayの呼び出しを追加します。から始まる。

2)ロードをURLLoaderに委任し、最初のロードが完了したらLoader.loadBytesを使用することができます。

これは純粋なAS3ですが、SWFLoaderを使用しているFLEXFrameworkに適応できます。

// child who hold the stuff to be loaded
var holder:MovieClip=new MovieClip();
addChild(holder);

// the loader used to load byte within the holder
var holderLdr:Loader=new Loader();
holder.addChild(holderLdr);


function load(url:String):void {
 var ldr:URLLoader=new URLLoader();
 ldr.dataFormat=URLLoaderDataFormat.BINARY;
 ldr.addEventListener(Event.COMPLETE, onComplete);
 ldr.load(new URLRequest(url));
}

function onComplete(e:Event):void {
    var ldr:URLLoader=URLLoader(e.target);

    ldr.removeEventListener(e.type, onComplete);

    if (holderLdr.hasOwnProperty("unloadAndStop")){
        holderLdr["unloadAndStop"]();
    } else {
        holderLdr.unload();
    }
    holderLdr.loadBytes(ldr.data);
    ldr.data=null;
}

load("mySWF.swf");
于 2009-12-17T14:02:07.447 に答える