2011-02-10 33 views
0

我正在播放多個短視頻剪輯,我希望它看起來像是一個連續的視頻。有沒有辦法將它們拼接在一起,以便在設置新的視頻源時不會引起注意。使用VideoPlayer播放連續兩個視頻,但沒有「之間的黑框」

此刻我遇到了一個問題,即在設置新視頻源時插入了黑框。事件的順序似乎是這樣的

- >視頻完成 - >完整的事件調度 - >設置源新的視頻 - >屏幕變爲空白(這不應該發生,而是應該保持視頻的最後一幀,直到新視頻被加載) - >幾個毫秒通過 - >新視頻開始播放。

是否可以避免屏幕變爲空白或保持最後一幀顯示,直到下一個視頻加載。

感謝,

丹尼斯

+0

你用什麼來播放你的視頻?這是在Web上還是在桌面應用程序上?您正在播放和打算支持的視頻的比特率是多少? – 2011-02-10 09:30:34

回答

0

從技術上講,它是可行的,但我懷疑你就可以得到這個權利的時候100%。以下是你需要這樣做的方法。

就在第一個(或之前)視頻結束之前,您必須在新播放器實例中加載下一個視頻。當然,取決於許多因素,在第一次完成之前多久才能加載下一個取決於許多因素。 1.下一個視頻的比特率 2.客戶機的Internet帶寬。 3.如果之前的視頻尚未完全加載,然後您需要加載下一個視頻,那麼您必須考慮到這一點,並且不會妨礙播放當前正在播放的視頻。 4.某些客戶端計算機可能無法做到這一點沒有口吃和毛刺。

問題的最佳解決方案是真正將視頻拼接在一起。當然,如果你事先不知道這個序列,那麼你就不能做到這一點,所以你只好繼續做前面提到的。

0

這是Shiv描述的雙人視頻播放器。這在很大程度上是有效的,除非下一個視頻加載時有短暫的暫停...仍然不理想。

<?xml version="1.0" encoding="utf-8"?> 
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300"> 
    <fx:Metadata> 
     [Event(name="complete", type="org.osmf.events.TimeEvent")] 
    </fx:Metadata> 

    <fx:Script> 
     <![CDATA[ 
      import org.osmf.events.MediaPlayerStateChangeEvent; 
      import org.osmf.events.TimeEvent; 
      import org.osmf.media.MediaPlayer; 
      import org.osmf.media.MediaPlayerState; 

      import spark.components.VideoPlayer; 

      var _source:String = ""; 
      var activePlayer:VideoDisplay = null; 
      var otherPlayer:VideoDisplay = null; 
      var playerIndex:int = 0; 

      public function set source (value:String) { 
       trace('set source: ' + value) 
       if(value == '' || value == null || value == _source) { 
        trace('rejected source'); 
        return; 
       } 

       if(activePlayer != null) { 
        activePlayer.depth = 3; 
       } 
       activePlayer = getElementAt(playerIndex) as VideoDisplay; 
       playerIndex = playerIndex == 0?1:0; 
       otherPlayer = getElementAt(playerIndex) as VideoDisplay; 
       trace('active player: ' + activePlayer.id); 
       activePlayer.addEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, player1_mediaPlayerStateChangeHandler); 
       activePlayer.source = value; 
       _source = value; 

      } 
      public function get source():String { 
       return _source; 
      } 

      protected function player1_mediaPlayerStateChangeHandler(event:MediaPlayerStateChangeEvent):void 
      { 
       trace('state change: ' + event.state + ', player: ' + (event.currentTarget.id)); 
       if(event.state == MediaPlayerState.READY) { 
        player1.removeEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE,player1_mediaPlayerStateChangeHandler); 
        player2.removeEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE,player1_mediaPlayerStateChangeHandler); 

        activePlayer.play(); 
        activePlayer.depth = 2; 
        otherPlayer.depth = 1; 
       } 
      } 

      protected function completeHandler(event:TimeEvent):void 
      { 
       if(event.currentTarget == activePlayer) { 
        trace('video complete'); 
        dispatchEvent(event); 
       } 
      } 

     ]]> 
    </fx:Script> 

    <s:VideoDisplay id="player1" autoRewind="false" complete="completeHandler(event)" autoPlay="true" opaqueBackground="false"/> 
    <s:VideoDisplay id="player2" complete="completeHandler(event)" autoRewind="false" autoPlay="true" opaqueBackground="false" /> 

</s:Group>