Почему я получаю сообщение об ошибке при поиске в моем проигрывателе потокового видео

Я создаю видеоплеер здесь: http://leongaban.com/stackoverflow/RTMP/

Это потоковая передача RTMP, и я пытаюсь заставить мое видео правильно искать, если пользователь нажимает на полосу канавки (серая полоса под зеленой полосой выполнения). В настоящее время он не выполняет поиск и дает мне NaN для моей переменной длительности и ошибку на моей переменной ширины индикатора выполнения, что меня озадачивает.

alt text

По какой-то причине моя переменная videoDuration становится NaN при использовании внутри моей функции поиска, также я получаю ошибку ссылки на нулевой объект при попытке отследить playerCntrls.progressTotalW, которая является общей шириной планка паза:

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

Теперь я добавляю EventListener в свой PlayerControls.as для вызова функции поиска в моем 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);
    }

Будем признательны за любые советы или рекомендации! :)


person Leon Gaban    schedule 28.01.2010    source источник
comment
Если кому-то понадобится больше кода, дайте мне знать, и я опубликую полный код из обоих классов.   -  person Leon Gaban    schedule 28.01.2010
comment
Находится ли videoDuration в той же области, что и getMetadata?   -  person Patrick    schedule 28.01.2010
comment
videoDuration - это частная переменная, которую я установил вверху, затем она устанавливается во время функции metaData, но теперь код исправлен thx на @bhups :)   -  person Leon Gaban    schedule 28.01.2010


Ответы (1)


Функция поиска вызывается в контексте класса PlayerControl, и в целом не рекомендуется устанавливать функцию другого класса для прослушивателей событий. Вы попробуете это:

...
groove.addEventListener(MouseEvent.MOUSE_UP, onGrooveClick);
...
private function onGrooveClick(e:MouseEvent):void {
  videoDsply.seeker(mouseX);
}
И в VideoDisplay соответствующим образом измените функцию поиска.

person bhups    schedule 28.01.2010
comment
ВУТ! Да, это исправило :) leongaban.com/stackoverflow/RTMP Теперь мне просто нужно поиграть с числами немного, индикатор выполнения немного скачет, затем переходит в нужное место, но, по крайней мере, теперь он ищет правильно: D, спасибо! - person Leon Gaban; 28.01.2010