2016-07-26 10 views
0

У меня есть Flash SWF, настроенный для воспроизведения сетевого потока в ответ на команды клавиатуры. Есть несколько очень коротких видеоклипов, которые запускаются с помощью цифровой клавиатуры. Поскольку их так много (в этом незавершенном примере всего несколько), для воспроизведения видео необходимо нажать два номера.AS3 KeyboardEvent не добавит eventListener после того, как NetStream остановлен

Первое число запускает функцию videoArray, а внутри функции videoArray создается новый eventListener для воспроизведения видео, а старый прослушиватель событий удален. Как только видео заканчивается, я использовал NetStatusEvent, чтобы удалить сетевой поток и снова добавить videoArray eventListener.

Все это прекрасно работает, однако, существует функция stopVideo, которая запускается клавишей S. Он имеет тот же код, что и NetStatusEvent, для удаления сетевого потока и повторного объявления eventListener, но удаляется только сетевой поток. Функция eventListener не добавляется.

Я пропустил что-то, что останавливает добавление eventListener, или я должен делать это по-другому? Можно ли пропустить до конца видео и запустить NetStatusEvent, чтобы остановить его?

import flash.ui.Keyboard; 
import flash.events.KeyboardEvent; 

// Create a NetConnection object 
var nc:NetConnection = new NetConnection(); 
nc.connect(null); 

// Create a NetStream object with NetConnection object as a parameter 
var ns:NetStream = new NetStream(nc); 
var vid:Video = new Video(); 

// Play control 
stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 

function preStop(event:KeyboardEvent):void { 
    if (event.keyCode == 97) { 
     trace("O Stop"); 
     ns.close(); 
     removeChild(vid); 
     vid.attachNetStream(null); 
    } 
    else if (event.keyCode == 98) { 
     trace("P Stop"); 
     ns.close(); 
     removeChild(vid); 
     vid.attachNetStream(null); 
    } 
} 

function videoArray(event:KeyboardEvent):void { 
    stage.removeEventListener(KeyboardEvent.KEY_DOWN,preStop); 
    stage.removeEventListener(KeyboardEvent.KEY_UP,videoArray); 

    if (event.keyCode == 97) { 
     stage.addEventListener(KeyboardEvent.KEY_UP,play1); 
     trace("play1"); 
    } 
    else if (event.keyCode == 98) { 
     stage.addEventListener(KeyboardEvent.KEY_UP,play2); 
     trace("play2"); 
    } 

    // PLAY 1 
    function play1(event:KeyboardEvent):void { 
     if (event.keyCode == 97) { 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play1); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play2); 

      // Play video 
      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      ns.play("cfa.mov"); 

      // Create a new Video object and attach NetStream object 
      vid.attachNetStream(ns); 
      addChild(vid);  
     } 
     else if (event.keyCode == 98) { 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play1); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play2); 

      // Create a NetStream object with NetConnection object as a parameter 
      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      ns.play("matilda.mov"); 

      // Create a new Video object and attach NetStream object 
      vid.attachNetStream(ns); 
      addChild(vid); 
     } 
     stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 
    } 

    // PLAY 2 
    function play2(event:KeyboardEvent):void { 
     if (event.keyCode == 97) { 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play1); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play2); 

      // Create a NetStream object with NetConnection object as a parameter 
      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      ns.play("illusionists.mov"); 

      // Create a new Video object and attach NetStream object 
      vid.attachNetStream(ns); 
      addChild(vid);  
     } 
     else if (event.keyCode == 98) { 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play1); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,play2); 

      // Create a NetStream object with NetConnection object as a parameter 
      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      ns.play("janis.mp4"); 

      // Create a new Video object and attach NetStream object 
      vid.attachNetStream(ns); 
      addChild(vid); 
     } 
     stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 
    } 

    function asyncErrorHandler(event:AsyncErrorEvent):void { 
     // ignore error 
    } 
} 





// Stop at end of video 
ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler); 

function statusHandler(event:NetStatusEvent):void 
{ 
    trace(event.info.code) 

    if (event.info.code == 'NetStream.Buffer.Empty') { 
     ns.close(); 
     removeChild(vid); 
     vid.attachNetStream(null); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN,preStop); 
     stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 
    } 
} 


// Pause control 
stage.addEventListener(KeyboardEvent.KEY_UP,togglePauseHandler); 

function togglePauseHandler(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.SPACE) { 
     ns.togglePause(); 
    } 
} 


// Stop control 
stage.addEventListener(KeyboardEvent.KEY_UP,stopVideo); 

function stopVideo(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.S) { 
     ns.close(); 
     removeChild(vid); 
     vid.attachNetStream(null); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN,preStop); 
     stage.addEventListener(KeyboardEvent.KEY_UP,videoArray); 
    } 
} 
+0

Я не смотрел слишком близко (вы вывесили много кода, который не очень легко читать), но ваш вопрос, вероятно, является результатом встроенных функций используются в качестве слушателей событий. Каждый раз, когда вызывается функция 'videoArray', создается целый новый набор методов play1/play, которые не совпадают с предыдущими, прикрепленными к вашему слушателю. – BadFeelingAboutThis

+0

Как я пытался сделать то, что вы предложили, я заметил, что прослушиватели событий были удалены в функции videoArray, и также не было никакого выражения. Таким образом, в любой момент времени нажатие клавиши (в данном случае S) прерывало функции eventListeners, но не вызывало функции play1, play2. спасибо, что посмотрели. – Browntastic

ответ

1

Вот как я буду перерабатывать ваш код. Гораздо чище и проще понять, что происходит с одним слушателем, и не добавлять и не удалять разных слушателей ключей все время. Смотрите код комментарии

import flash.events.AsyncErrorEvent; 
import flash.events.NetStatusEvent; 
import flash.media.Video; 
import flash.net.NetConnection; 
import flash.net.NetStream; 
import flash.ui.Keyboard; 
import flash.events.KeyboardEvent; 

// Create a NetConnection object 
var nc:NetConnection = new NetConnection(); 
nc.connect(null); 

// Create a NetStream object with NetConnection object as a parameter 
var ns:NetStream = new NetStream(nc); 

//add your netstream listeners just once (the next line was in your play functions) 
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler); 

var vid:Video = new Video(); 



var firstNum:int = 0; //to track the first number pressed in a set 

//a list of all your videos, this example supports 81 items in this array/list. 
var streams:Array = ["matilda.mov", "cfa.mov", "illusionists.mov", "janis.mp4"]; 

// A single Key up listener to handle everything 
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp); 

function asyncErrorHandler(event:AsyncErrorEvent):void { 
    //ignore error 
} 

//write the close and open stream code just once 
function closeStream(event:KeyboardEvent):void { 
    ns.close(); 
    removeChild(vid); 
    vid.attachNetStream(null); 
} 

function openStream(path:String):void { 
    // Play video 
    ns.play(path); 

    // Create a new Video object and attach NetStream object 
    vid.attachNetStream(ns); 
    addChild(vid); 
} 

function keyUp(event:KeyboardEvent):void { 
    //if they key event is numpad key 
    if (event.keyCode >= Keyboard.NUMPAD_1 && event.keyCode <= Keyboard.NUMPAD_9) { 
     var index:int = event.keyCode - Keyboard.NUMPAD_0; //which number was pushed between 1 - 9 


     if (firstNum < 1) { 
      //if this is the first number press, just assign that number 
      firstNum = index; 
     }else { 
      //if the second press, play the appropriate video 

      //this is the math for finding the video number 
      index = ((firstNum - 1) * 9) + index - 1; // -1 one at the end since arrays are 0 based 

      //if the number is higher the amount of videos available, set the index to the last video in the list 
      if (streams.length >= index) { 
       index = streams.length - 1; 
      } 

      //play the video 
      openStream(streams[index]); 

      //reset the firstNum 
      firstNum = 0; 
     } 

     return; //don't look at any other key presses below since there's no reason to 
    } 

    switch(event.keyCode) { 
     case Keyboard.SPACE: 
      ns.togglePause(); 
      break; 

     case Keyboard.S: 
      closeStream(); 
      break; 
    } 
} 

function statusHandler(event:NetStatusEvent):void { 
    trace(event.info.code) 

    switch(event.info.code){ 
     case 'NetStream.Buffer.Empty': 
     case 'NetStream.Play.Stop': 
     case 'NetStream.Play.Complete': 
      closeStream(); 
      break; 
    } 
} 
1

Слушатели событий удаляются в функции videoArray, и нет инструкции else. Таким образом, в любое время нажата другая клавиша, она отключает eventListeners, но не вызывает функции play1, play2.

+0

Это действительно похоже на проблему. Это и, возможно, что слушатели снова добавляются, если вы нажмете 'S' или пустые ячейки netstream. – BadFeelingAboutThis