2009-02-02 36 views
6

我使用VideoDisplay播放flv,mov和mp4,一切都很好。它們都是通過漸進式下載加載的,並且沒有進行流式傳輸。我想要做的是抓住一個指定的幀(比如10秒鐘顯示的任何一幀),將其轉換爲位圖並將該位圖用作視頻的預覽圖像。我想在運行時執行此操作,因此我不必爲將顯示的每個視頻都創建預覽圖像。Flex:爲視頻動態創建預覽圖像

任何想法如何做到這一點?我寧願不玩弄它 - 尋找特定的框架,然後暫停它,但我可能沒有別的選擇?

回答

2

Ryan和詹姆斯是正確的 - 正確的方式可能是提取在上傳/轉碼時間框架。但是,如果這不是一種選擇,你可以選擇使用某種默認/佔位符的圖像(通用或某種方式適用於所有尚未捕獲到大拇指的視頻),並使用VideoDisplay的DisplayObject-ness搶,然後上傳一幀到您的服務器,如:

<mx:Script> 
    <![CDATA[ 

     var captured:Boolean; 

     private function creationCompleteHandler(event:Event):void 
     { 
      videoDisplay.source = "http://yourserver/yourvideo.flv"; 
     } 

     private function videoDisplay_playheadUpdate(event:VideoEvent):void 
     { 
      if (!captured && videoDisplay.playheadTime >= 10) 
       capture(); 
     } 

     private function capture():void 
     { 
      var bmpData:BitmapData = new BitmapData(videoDisplay.width, videoDisplay.height); 
      bmpData.draw(videoDisplay); 

      captured = true; 

      // Now just upload the byte array to your server for the next user 
      var loader:URLLoader = new URLLoader(); 
      loader.dataFormat = URLLoaderDataFormat.BINARY; 

      // ... etc. 
     } 

    ]]> 
</mx:Script> 

<mx:VideoDisplay id="videoDisplay" playheadUpdate="videoDisplay_playheadUpdate(event)" /> 

再次,這也許不是最完美的解決方案,但它肯定有效。這樣,第一個用戶可以看到通用圖像,但每個用戶之後都會獲取生成的縮略圖。 (當然,那時你會上傳並正確關聯)。有意義嗎?

+0

我落得這樣做非常相似,這個東西(我也許應該規定,應用程序需要能夠離線運行,所以我不容易接觸到服務器的大部分時間),但我最終編碼了一個涉及加載視頻並在我需要的框架中暫停的黑客。謝謝! – onekidney 2009-02-04 18:54:26

1

我很確定這是不可能的。很可能......但不這麼認爲。我認爲加載視頻的唯一方法是使用NetStream和NetConnection對象,正如你所知道的那樣,它只是開始加載視頻。

如果這是用戶生成的視頻,我認爲最好的辦法是有一個生成的預覽圖像的一些serever端腳本。不知道這是如何完成的,但認爲這是大多數剪輯網站的工作原理。

如果所有的影片都在你的控制有可能寫一個腳本的視頻編輯程序的一個自動生成圖像從文件列表中的特定幀。我認爲這可能是你作爲替代品的最佳途徑,可以快速啓動並運行。

很抱歉的模糊的回答......如果你需要一個快速的解決方案,可能你指出正確的方向。

-1

我同意詹姆斯,要真正做到這一點是與服務器端腳本來完成它,把某些幀出視頻的唯一途徑。即使你可以用flex做這件事,你真的不希望在客戶端機器上做這件事(這將是我認爲的處理器密集型)的負擔。更不用說,在手動創建圖像的時候,比每次加載時彈性確定縮略圖顯示效率要高得多。