2012-02-20 84 views
3

我在一個AS3項目上播放視頻(H264)。由於某些特殊原因,我想要去某個位置。Netstream和step()或seek()?

a)我用NetStream.seek()試試。那裏只有關鍵幀。在我目前的情況下,這意味着,我可以每1秒找到一個位置。 (爲了更好的分辨率,我不得不電影與許多關鍵幀越好,又名每一幀關鍵幀編碼)

  • 這是definetly不是我喜歡的方式,因爲我不想一切重新編碼vids。

b)我用NetStream.step()試試。這應該讓我有機會慢慢地從一個幀到另一個幀。但在文檔中提到:

此方法僅在數據從Flash Media Server 3.5.3或更高版本以及NetStream.inBufferSeek爲true時纔可用。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#step()

這是否意味着,這是不可能與空氣的桌面?當我嘗試它時,沒有任何工作。

有什麼建議,該如何解決這個問題?

問候&謝謝! Nicolas

回答

1

除非您有Flash Media Server託管您的視頻,否則Flash視頻只能按秒提前。從技術上講,這意味着你可以在Air中按照預期工作,但是,視頻必須是流媒體(愚蠢的adobe ...)。

你有兩個選擇:

1)導入素材的影片剪輯。 Flash IDE爲此提供了一個嚮導,如果您只在非FlashIDE環境中開發,則可以將其作爲外部資產(如SWF或SWC)進行轉換和導出。然後將這些內容或運行時加載到您的應用程序中,以便訪問MovieClip的每幀可執行方法。但是,這確實伴隨着一些音頻同步問題(iirc)。而且,向後擦洗不是MC的特點。

2)寫你自己的視頻對象,加載一個圖像序列,並按順序顯示每一幀。您必須設置自己的音頻同步功能,但它可能是除FLVComponent或NetStream之外最直接的解決方案。

1

我注意到flash player 9擦洗的很好而且很流暢,但是在玩家10+中我得到了這個沒有磨砂的問題。

我的修復程序是將搜索功能的調用頻率限制爲< = 200ms。這固定的清理,但作爲播放器9不太順利。也許是因爲「Flash視頻只能提前幾秒」的限制?我使用了一個定時器來調整爲視頻調用seek()的函數。

private var scrubInterval:Timer = new Timer(200); 

    private function videoScrubberTouch():void { 
     _ns.pause(); 

     var bounds:Rectangle = new Rectangle(0,0,340,0); 

     scrubInterval.addEventListener(TimerEvent.TIMER, scrubTimeline); 
     scrubInterval.start(); 

     videoThumb.startDrag(false, bounds); 


    } 
    private function scrubTimeline(e:TimerEvent):void { 
     var amt:Number = Math.floor((videoThumb.x/340) * duration); 
     trace("SCRUB duration: "+duration+" videoThumb.x: "+videoThumb.x+" amt "+amt); 

     _ns.seek(amt); 

    } 
0

請檢查該Demo link(或獲得the SWF file通過桌面Flash播放器,以測試瀏覽器以外)。
注意:演示需要帶有H.264視頻編解碼器和AAC或MP3音頻編解碼器的FLV。

該源代碼是在這裏:Github link

在上述演示有(字節爲基礎的)尋求和由幀步進幀。要重點研究的功能是:

  • Append_SEEK(位置量) - 這將獲得以字節爲單位的指定位置,並搜索最近的可用關鍵幀。

  • get_frame_TAG - 這將提取一個標籤,其中包含一幀數據。音頻也可以在幀中,但假設您只有視頻。該功能是您調整時間戳的機會。當它運行時它也會附加標籤(所以每個「get_frame_TAG」也是一個「框架步驟」)。

例如:你有一個25fps的視頻,你想要的第三幀,在4秒後進入回放...

1000 milisecs/25幀= 40個單位對於每個時間戳。
因此4000毫秒== 4秒+添加40 x第3幀==預期的時間戳4120.

因此,獲取該幀意味着...首先找到一個關鍵幀。然後逐個檢查代表所需幀的時間戳。如果不是,則將其更改爲與最近的關鍵幀時間戳相同(這會強制Flash在幀中快進以保持同步,因爲它假定該幀[具有比期望的時間戳小的幀]應當在那段時間播放) 。如果您不喜歡快進的外觀,您可以在此過程中「隱藏」視頻對象。

相關問題