Как отправить сообщение на сцену, если поток AS3 FLVPlayback не найден

Я успешно создал компонент FLVPlayback, используя библиотеку компонентов, и он воспроизводит потоковое видео, которое мне нужно. Мой вопрос: если этот поток не в сети или не может быть найден, как мне отобразить сообщение на сцене, чтобы пользователь знал, что активного потока нет.

ОБНОВЛЕНО: вот мой код -

thestream.addEventListener(NetStatusEvent.NET_STATUS, onNCStatus);
function onNCStatus(event:NetStatusEvent):void {
    trace(event.info.code)
    switch (event.info.code) {
        case "NetConnection.Connect.Success":
            trace("Success");
            break;
        case "NetStream.Play.StreamNotFound":
            trace("Stream not found");
            break;
    }   
}

Выхода по-прежнему нет. Похоже, что функция не вызывается. Однако, если я помещаю трассировку вне функции (перед ней), я получаю ответ:

trace(NetStatusEvent.NET_STATUS);

выход:

netStatus

Надеюсь это поможет.


person NaN    schedule 10.03.2011    source источник


Ответы (3)


flvPlaybackComponent.addEventListener(*NetStatusEvent.NET_STATUS*, onNCStatus);

Трудно сказать, не видя вашего кода. Для начала рекомендуется убедиться, что в вашем коде никогда не будет строк для функциональности, поэтому вы должны заменить строку «netStatus» на NetStatusEvent.NET_STATUS, которая является статической постоянной переменной.

person Christopher Grigg    schedule 11.03.2011

Поместите прослушиватель в экземпляр вашего компонента:

flvPlaybackComponent.addEventListener("netStatus", onNCStatus);

function onNCStatus(event:NetStatusEvent):void {
 trace(event.info.code)
 switch (event.info.code) {
  case "NetConnection.Connect.Success":
      trace("Success");
      break;
  case "NetStream.Play.StreamNotFound":
     trace("Stream not found");
     break;
 }   
}

Затем просто поместите свой визуальный элемент где-нибудь на сцену и сделайте с ним то, что вам нужно, в области потока, не найденной в функции слушателя.

person jpea    schedule 10.03.2011
comment
У меня проблемы с запуском функции. Я заменил flvPlaybackComponent именем экземпляра FLVPlayback thestream, но при попытке экспорта ничего не появляется на вкладке «Вывод». - person NaN; 11.03.2011
comment
Я отредактировал свой код выше, чтобы отследить каждый код состояния. Это по крайней мере что-то отследит, если имя экземпляра правильное. Попробуйте и дайте мне знать. - person jpea; 11.03.2011
comment
Не могли бы вы опубликовать свой фла для этого? эта часть: трассировка (NetStatusEvent.NET_STATUS); просто отслеживает имя события, которое вы ищете, а не фактический экземпляр. Это похоже на трассировку (привет) - она ​​возвращает только то, что вы запрашиваете, а не фактическое событие, которое срабатывает. - person jpea; 11.03.2011
comment
Я бы просто предложил сделать ваш видеоплеер в коде, так как с этим компонентом немного сложнее иметь дело, но если все, что вам нужно, это не работает, это иметь возможность выдать ошибку, когда у вас есть недопустимый источник, это путем переработки ваш код выглядит следующим образом: pastebin.com/aU7WXd2Q — по сути, удалите исходный URL-адрес на панели свойств вашего компонент, поместите его на панель действий как свойство экземпляра вашего проигрывателя, затем выполните попытку/поймать, если он не может найти файл (все это находится в этой ссылке на pastbin, кстати) - person jpea; 12.03.2011
comment
У меня не хватило времени, чтобы попробовать это еще на работе, но я смогу потратить немного времени на выходных. Спасибо за начало, и я обновлю эту тему, как только добьюсь прогресса. - person NaN; 12.03.2011

Используйте событие STATE_CHANGE компонента FLVPlayback и проверьте состояние, если оно является CONNECTION_ERROR. Вы также можете проверить там, началось ли воспроизведение вашего видео, закончилось ли оно и так далее.

Приведенный ниже код является образцом, который вы можете использовать в качестве класса документа для as3 fla:

package
{
    import flash.display.Sprite;
    import fl.video.FLVPlayback;
    import fl.video.VideoEvent;
    import fl.video.VideoState;
    public class Player extends Sprite
    {
        public var playback:FLVPlayback;

        public function Player()
        {
            playback.addEventListener(VideoEvent.STATE_CHANGE, onStateChange);
        }

        private function onStateChange(ev:VideoEvent):void
        {
            if (ev.state == VideoState.CONNECTION_ERROR)
            {
                trace("could not load video");
            }
        }
    }
}

ОБНОВЛЕНИЕ. Чтобы ваш обновленный код работал, измените событие NetStatus на событие STATE_CHANGE:

thestream.addEventListener(VideoEvent.STATE_CHANGE, onNCStatus);
   function onNCStatus(event:VideoEvent):void {
       trace(event.info.code)
       switch (event.state) {
           case VideoState.CONNECTION_ERROR:
               trace("Stream not found/Could not connect to stream");
               break;
       }   
   }

Компонент FLVPlayBack НЕ отправляет событие NetStatus.

person Malyngo    schedule 11.03.2011
comment
Малинго, я попробовал твой код, но получаю ошибку в строке 2 Scene 1, Layer 'actions', Frame 1, Line 2 1037: Packages cannot be nested. - person NaN; 11.03.2011
comment
Вы помещаете приведенный выше код в скрипт фрейма, поэтому он не работает. Просто используйте строку playback.addEventListener(VideoEvent.STATE_CHANGE, onStateChange); и код функции onStateChange, если вы хотите использовать ее как фреймскрипт. Возможно, вам придется опустить частное в функции, так что это похоже только на function onStateChange(ev:VideoEvent):void{ ... - person Malyngo; 14.03.2011
comment
Интересно. Я попробую. - person NaN; 16.03.2011
comment
Ну, я заставил его работать так, что он отслеживает сообщения «Воспроизведение» и «Буферизация» каждые несколько секунд, но когда я отключаю сервер от потоковой передачи, я не получаю в выводе сообщение о том, что потока нет. связаны. Это сводит меня с ума! ;о - person NaN; 21.03.2011