2009-11-03 137 views
1

我將多個影片存儲爲影片剪輯對象,並希望將它們合併到單個影片剪輯視頻對象中,以便按順序播放所有視頻(以便用戶認爲它是單個視頻)。將多個影片剪輯合併成一個單獨的影片剪輯

非常感謝!

編輯:我想以編程方式在ActionScript中的Flash播放器。

回答

-1

將它們添加到時間軸中,確保每個動畫片段存在於時間線上,只要它包含的動畫的持續時間是。您可以通過將關鍵幀添加到將包含影片剪輯的時間軸中來實現。另外,請確保您的視頻幀率和Flash播放器幀率相同。

這不是一個真正的編程問題。

+0

我剛剛澄清說我需要在ActionScript中使用Flash Player,所以它是一個編程問題。 – bartekb

1

如果有TIMELINE_COMPLETE事件會很好。但沒有!所以下一個最好的事情是無證的addFrameScript方法。

您可以使用addFrameScript()將代碼添加到您的動畫片段(或任何其他幀)的最後一幀。此代碼可以刪除舊的MovieClip(剛剛完成的),並添加新的MovieClip(隊列中的下一個)。

public function Main() 
{ 
    // Remember addFrameScript() is zero based. 
    currentVidMc.addFrameScript(currentVidMc.totalFrames - 1, frameFunction); 
} 

private function frameFunction():void 
{ 
    //delete frame script by passing null as second parameter 
    currentVidMc.addFrameScript(currentVidMc.totalFrames - 1, null); 

    removeChild(currentVidMc); 
    addChild(newVidMc); 
    newVidMc.gotoAndPlay(1); 
} 

編輯*

爲了平穩過渡,你可以嘗試在新的剪輯初裝(約15幀聽起來不錯,但你必須嘗試)可見設置爲假,並停止。然後,當前剪輯的最後一幀滾動時,只需刪除當前剪輯,並將新剪輯可見屬性設置爲true,然後播放它。大部分跳轉來自將剪輯加載到舞臺上,因此預渲染剪輯可能會有所幫助。

+0

謝謝。不幸的是,這並沒有解決我的問題。我使用MovieClip的ENTER_FRAME事件做了類似的事情。當觸發ENTER_FRAME事件時,我將currentFrame與totalFrames進行比較,如果它們相等,則我開始播放後續的MovieClip。不過,我在MovieClips的拼接點處得到明顯的延遲。我認爲我可以擺脫延遲,如果有可能將影片剪輯合併爲一個。可能嗎? – bartekb

+0

你是非常正確的。這是一個常見問題。我已經添加了對我的答案的編輯,可能有所幫助。 –

+0

謝謝。我嘗試了預加載所有內容,但仍然在我切換MovieClips時調用play()或gotoAndPlay()時,即使在相當快的機器上,延遲也是顯而易見的。似乎沒有辦法繞過它。 – bartekb

0

不是一個真正的答案,而是兩件你可以試試的東西。

package { 
    import flash.display.MovieClip; 
    import flash.events.Event; 

    public class OneMovieToRuleThemAll extends MovieClip { 

     public subClips:Array; //vector for cs4 
     private var index:int = 0; 

     public function OneMovieToRuleThemAll(subClips:Array) { 
      this.subClips = subClips; 
     } 

     //pre subClips.length > 0 
     public function playAll() { 
      for(var i:int = 0; i < subClips.length; i++) { 
       subClips[i].visible = i == 0; 
       subClips[i].stop(); 
       addChild(subClips[i]); 
      } 
      addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     } 

     private function onEnterFrame(e:Event) { 
      if(index >= subClips.length) { 
       //dispatchEvent finished 
       removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
      } 

      if(subClips[index].currentFrame < subClips[index].totalFrames) { 
       subClips[index].gotoAndStop(subClips[index].currentFrame + 1); 
      }else{ 
       subClips[index].visible = false; 
       index++; 
       subClips[index].visible = true; 
      } 

     } 
    } 

} 

它通常不鼓勵使用ENTER_FRAME和gotoAndStop(設置currentFrame),因爲它是緩慢的,但也許這是每個幀同樣緩慢的,所以你不會發現任何「拼接」

另一種也可能是建BitmapData.draw(..);每個電影的每一幀都有一個新的動畫片段。然後使用相同的enter_frame循環並切換每個幀的可見屬性。 可能會使用分配的內存,我不知道它是否是遠程可行的速度明智的。

0

如果我是你,我會賴特一個簡單的包裝它會只是: *知道文件的順序從一些XML配置 顯示*,而玩的第一個文件的措施FPS(或可用RAM或互聯網連接 - 取決於你如何將文件傳送到電腦上播放vedia) *最後,封裝程序決定它只是將第二個文件加載到某個可播放百分比的預計時間的200%-300%。 *如果您的預測算法足夠酷 - 在第一次停止之前您有第二個vid。所以這裏是最簡單的部分imho [如果你的最後一幀和第一幀匹配得足夠好]:你只需暫停你需要的幀上的第二個vid,並將它的'alpha設置爲0,將它置於第一個之下。當第一個來到匹配框架,你開始減少它的alpha增加第二個',而不是從暫停釋放它。

唯一的人工任務(除了編碼包裝,但它感覺就像一對代碼最大的屏幕)正在尋找匹配的幀並把它全部配置,但你可以通過使用BitmapData.compare()方法。祝你好運!