質問

このコードにより、F4Vファイルは時期尚早に再生を停止します。時間は変わりますが、約8〜10秒です。

loadSong();

    function loadSong()
    {
        if(!songPlaying)
        {
            songPlaying = true;
            var customClient:Object = new Object();
            customClient.onCuePoint = cuePointHandler;
            customClient.onMetaData = metaDataHandler;

            var nc:NetConnection = new NetConnection();
            nc.connect(null);
            var ns:NetStream = new NetStream(nc);
            ns.client = customClient;
            ns.play("song.f4v");
        }

            trace("HERE");

    }


    function cuePointHandler(infoObject:Object):void{
    trace(infoObject.name);
    }
    function metaDataHandler(infoObject:Object):void {
    trace("metaData");
    }

このコードは、F4Vが最後まで再生されます。 wtf!?関数を介してそれを呼ぶとき、それは問題を引き起こすようです。参考までに、コードはメインタイムラインの最初のフレームに保存され、F4Vはオーディオのみです。どんな助けも感謝します。

if(!songPlaying)
{
    songPlaying = true;
    var customClient:Object = new Object();
    customClient.onCuePoint = cuePointHandler;
    customClient.onMetaData = metaDataHandler;

    var nc:NetConnection = new NetConnection();
    nc.connect(null);
    var ns:NetStream = new NetStream(nc);
    ns.client = customClient;
    ns.play("song.f4v");
}
役に立ちましたか?

解決

あなたがあなたを宣言するとき、何が起こっているのか NetConectionNetStream 関数の内部は、その変数の範囲がその関数のローカルであることです。それは、他に何も参照していないことを意味します NetConnection あなたが作成したので、ガベージコレクターは次の実行中にそれを一掃します(そのため、さまざまな時間が表示されています)。

IFステートメントでそれを宣言すると、変数は映画の範囲内にあり、それがそれらへの参照を保持しているため、ガベージは収集されません。

私はあなたのコードの残りの部分のアーキテクチャが何であるかわかりませんが、あなたがあなたのコードを保持して関数を使用する場合は、 var nc:NetConnection = new NetConnection(); 直前に loadSong(); 声明。

アーキテクチャには、コードをフレームからリファクタリングすることをお勧めしますが、コードのほんの数行であれば、それは本当に価値がないかもしれません。プロジェクトに依存するだけです。

ガベージコレクションの詳細については、ご覧ください フラッシュプレーヤーのごみ収集を理解9 (フラッシュプレーヤー9と書かれていますが、これも10に適用できます)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top