2011-01-12 4 views
1

の「求めている」状態を解除するためにはどのようにいくつかのビデオを再生VideoDisplayインスタンスを持っています。私は、ビデオスライダー(また私のコンポーネント)videoDisplay.playheadTimeが設定されているプロパティをクリックするとvideoDisplay.stateは(再びvideoDisplayは、新しい位置のために追求して、ビデオを再生)一瞬「求めている」状態に「演奏」から移行した場合。意図されたbevaiour。はFlex3のVideoDisplayクラス

しかし、私が(または任意のランダムなユーザー)十分に速ければ、プレーヤーがまだ「シーク」状態にある間にもう一度playheadTimeを設定することができます。何度かクリックする度に何度かクリックすると、私はクリックしたビデオのすべての場所にジャンプします(これは最後のクリックから約10〜15秒後に発生します)。私がライブドラッグを使用すると、シークによって圧倒されたvideoDisplayが「エラー」状態になります。

私の質問は - VideoDisplayクラスの求めている状態を解除する方法はありますか?たとえば、プレーヤーが「シーク」状態にある場合、私はplayheadTimeを設定し、プレーヤーは最後にシークしたことを忘れて、ビデオの新しい場所を見つけようとします。

私は「Flex4 VideoPlayerクラスを使用して」のような無意味な答えをdownvoteう!

+0

ビデオプレーヤーのコードを共有できますか? – Neeraj

答えて

1

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(); 
} 

ここでコマンドはAS3のここでの信号の代わりに、イベント、およびCoreUtils.Call後で使用することができますを使用して

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(); 
     } 
    } 

イムですsetInterval、またはTimer。しかし、このアイデアは、ビデオが一時停止されるまでシークを呼び出さず、シークが完了したときを追跡することです。

+0

申し訳ありませんが、私の例は、大規模なビデオシステムで作業している途中で非常に抽象化されています。 – JTtheGeek

+0

答えは10xです。この質問はすでに8ヶ月ですが、私はもはやこの問題を抱えていません(私はそれをどのように修正したか覚えていませんが)あなたの答えを受け入れupvoteします。 – fiction

関連する問題