0

私はここでビデオプレーヤーを構築しています:http://leongaban.com/stackoverflow/RTMP/

これはストリーミングRTMPであり、ユーザーがグルーブバー(緑色のプログレスバーの下にある灰色のバー)をクリックした場合にビデオを正しくシークさせようとしています。現在、シークせず、継続時間変数にNaNが表示され、エラーが発生します。プログレスバーの幅の変数で、私を困惑させています。

代替テキスト

何らかの理由で、シーカー関数内で使用すると、videoDuration変数がNaNとして表示されます。また、グルーブバーの合計幅であるplayerCntrls.progressTotalWをトレースしようとすると、nullオブジェクト参照エラーが発生します。

VideoDisplay.as

public function seeker(e:MouseEvent):void
{
    trace("clicked the groove bar");
    trace("mouseX = "+mouseX);
    trace("videoDuration = "+videoDuration);
    trace("playerCntrls.progressTotalW = "+playerCntrls.progressTotalW);

    ns.seek(Math.round(mouseX * videoDuration / playerCntrls.progressTotalW));
    playerCntrls.progressBar.width = mouseX * playerCntrls.progressTotalW / videoDuration;
}

[トレース]

clicked the groove bar
mouseX = 135
videoDuration = NaN
TypeError: Error #1009: Cannot access a property or method of a null object reference.

ただし、updateDisplay関数では、同じ変数をトレースまたは使用してもエラーは発生しません。

private function updateDisplay(e:TimerEvent):void
{
   currentTime = ns.time;
   currentFormattedTime = convertTime(currentTime);

   playerCntrls.updateTime();
   playerCntrls.progressBar.width = ns.time * playerCntrls.progressTotalW / videoDuration;
   trace("videoDuration = "+videoDuration);
   trace("ns.time        = "+ns.time);
   trace("Progress Width = "+playerCntrls.progressBar.width);
}

ここで、videoDuration変数を設定します。

function getMetaData(client_ns) 
{
    var metaData:Object = new Object();
    metaData.onMetaData = function(metaData:Object):void 
    {

    videoDuration = metaData.duration;
    trace("metadata duration = "+videoDuration);

    tmrDisplay.start();
    }
    return client_ns.client = metaData;
}

playerCntrlsは私のPlayerControls.asにリンクしています

public var playerCntrls:PlayerControls;

PlayerControls.as

ここで、PlayerControls.asにEventListenerを追加して、VideoDisplay.asのシーカー関数を呼び出します。

// Create Progress Bar ··········································
    public function createProgress():void
    {
        progressBar               = new ProgBar;
        progressBar.mouseEnabled  = false;
        progressBar.mouseChildren = false;

        progressBar.x     = grooveX;
        progressBar.y     = grooveY;
        progressBar.width = 1;

        progressBar_color = progressBar.colorChip;
        TweenLite.to(progressBar_color, .1, {tint:xmlColor});
        controls.addChild(groove);
        controls.addChild(progressBar);

        groove.addEventListener(MouseEvent.MOUSE_UP, videoDsply.seeker);
    }

ヒントやアドバイスをいただければ幸いです。:)

4

1 に答える 1

1

シーカー関数はPlayerControlクラスのコンテキストで呼び出されており、一般に、イベントリスナー用に他のクラスの関数を設定することはお勧めできません。これを試してみてください:

...
groove.addEventListener(MouseEvent.MOUSE_UP, onGrooveClick);
...
private function onGrooveClick(e:MouseEvent):void {
  videoDsply.seeker(mouseX);
}
また、VideoDisplayで、それに応じてシーカー関数を変更します。

于 2010-01-28T18:14:45.530 に答える