2011-01-12 2 views
1

동영상을 재생하는 인스턴스가 있습니다. 비디오 슬라이더 (또한 내 구성 요소)를 클릭하면 videoDisplay.playheadTime 속성이 설정되고 잠시 동안 은 '재생 중'에서 '검색 중'상태가됩니다 (videoDisplay은 새 위치를 찾고 비디오를 다시 재생합니다) . 예정된 bevaiour.Flex3 VideoDisplay 클래스의 '찾기'상태를 취소하는 방법

그러나 내가 (또는 무작위 사용자가) 충분히 빠르면 플레이어가 여전히 '찾는'상태 인 동안 playheadTime을 다시 설정할 수 있습니다. 몇 번 반복 할 때마다 클릭이 대기열에 들어가고 내가 클릭 한 비디오의 모든 부분에 videoDisplay이 점프합니다 (이 작업은 마지막 클릭 후 약 10-15 초 간격으로 발생합니다). 라이브 끌기를 사용하면 seek에 의해 압도 된 videoDisplay이 '오류'상태가됩니다.

내 질문은 - VideoDisplay 클래스의 상태를 찾는 것을 취소 할 수있는 방법이 있습니까? 예를 들어 플레이어가 '찾기'상태에있는 경우, 나는 playheadTime을 설정하고 플레이어는 마지막으로 찾는 것을 잊어 버리고 비디오의 새로운 위치를 찾습니다.

나는 'Flex4 VideoPlayer 클래스 사용'과 같은 무의미한 답변을 하향식합니다!

+0

동영상 플레이어에 대한 코드를 공유해주세요. – Neeraj

답변

1

하나의 가능한 방법은 구성 요소에 비디오 디스플레이를 감싸고 탐색을 조금 더 잘 관리하는 것입니다. 따라서 누군가가 탐색을 요청하면 비디오가 현재 탐색 중이 아닌지 확인하십시오. 그렇다면 현재 작업이 완료 될 때까지 기다렸다가 새 작업을 계속 진행하십시오. 사용자가 다시 탐색하려고하면 현재 보류중인 작업을 모두 버리고 최신 작업을 다음 작업으로 만듭니다. 지금이 정확한 문제에서 작업 .... 여기에 코드입니다 : 여기

public function Seek(nSeconds:Number, bPlayAfter:Boolean):void 
{ 
    trace("Player Seek: "+ nSeconds); 
    var objSeekComand:VideoPlayerSeekCommand = new VideoPlayerSeekCommand(ucPlayer, nSeconds, bPlayAfter); 
    ProcessCommand(objSeekComand); 
} 

protected function ProcessCommand(objCommand:ICommand):void 
{ 
    if(_objCurrentCommand != null) 
    { 
     _objCurrentCommand.Abort(); 
    } 

    _objCurrentCommand = objCommand 
    objCommand.SignalCommandComplete.add(OnCommandComplete); 
    objCommand.Execute(); 
} 

여기에 대신 이벤트의 명령을

public class VideoPlayerSeekCommand extends CommandBase 
    { 
     private var _ucVideoDisplay:VideoDisplay; 
     private var _nSeekPoint:Number; 
     private var _bPlayAfterSeek:Boolean; 
     private var _bIsExecuting:Boolean; 

     public function VideoPlayerSeekCommand(ucVideoDisplay:VideoDisplay, nSeekPointInSeconds:Number, bPlayAfterSeek:Boolean, fAutoAttachSignalHandler:Function = null) 
     { 
      _ucVideoDisplay = ucVideoDisplay; 
      _nSeekPoint = nSeekPointInSeconds; 
      _bPlayAfterSeek = bPlayAfterSeek; 

      super(fAutoAttachSignalHandler); 
     } 

     override public function Execute():void 
     { 
      //First check if we are playing, and puase if needed 
      _bIsExecuting = true; 
      if(_ucVideoDisplay.playing == true) 
      { 
       _ucVideoDisplay.addEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, OnPlayerStateChangedFromPlay, false, 0, true); 
       _ucVideoDisplay.pause(); 
      } 
      else 
      { 
       DoSeek(); 
      } 

     } 

     protected function OnPlayerStateChangedFromPlay(event:MediaPlayerStateChangeEvent):void 
     { 
      _ucVideoDisplay.removeEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, OnPlayerStateChangedFromPlay); 
      if(_bIsExecuting == true) 
      { 
       if(_ucVideoDisplay.playing == false) 
       { 
        DoSeek(); 
       } 
       else 
       { 
        throw new Error("VideoPlayerSeekAndPlayCommand - OnPlayerStateChangedFromPlay error"); 
       } 
      } 
     } 

     private function DoSeek():void 
     { 
      if(_bIsExecuting == true) 
      { 
       _ucVideoDisplay.seek(_nSeekPoint); 
       CheckSeekComplete(); 
      } 
     } 

     private function CheckSeekComplete():void 
     { 
      if(_bIsExecuting == true) 
      { 
       if (Math.abs(_ucVideoDisplay.currentTime - _nSeekPoint) < 2) 
       { 
        if(_bPlayAfterSeek == true) 
        { 
         _ucVideoDisplay.play(); 
        } 
        DispatchAndDestroy(); 
       } 
       else 
       { 
        CoreUtils.CallLater(CheckSeekComplete, .07); 
       } 
      } 
     } 

     override public function Abort():void 
     { 
      _bIsExecuting = false; 
      SignalCommandComplete.removeAll(); 
     } 
    } 

임 사용 AS3 신호를의, 그리고 CoreUtils.Call 나중에 사용할 수 있습니다 setInterval 또는 Timer. 그러나 아이디어는 비디오가 일시 정지 될 때까지 탐색을 요청하지 않고 탐색이 완료되는 시점을 추적하는 것입니다.

+0

죄송합니다. 큰 비디오 시스템에서 작업하는 과정에서 내 예제가 너무 많이 추상화되어 있습니다. – JTtheGeek

+0

10x 대답입니다. 이 질문은 이미 8 개월이며 나는 더 이상이 문제가 없다. (나는 그것을 어떻게 고쳤는지조차 기억이 안나지만) 당신의 대답을 받아 들일 것이고 upvote 할 것이다. – fiction