2011-08-12 111 views
1

我在我的網站上有一些第三方Flash SWF,大小可達100KB。例如Flash視頻播放器「JWPlayer」SWF爲98KB。如何在Flash SWF加載時顯示預覽圖像?

這沒什麼人用寬帶,但對於緩慢的撥號帶寬遊客不是那麼好。例如在40千比特/秒時,我們正在說20秒來下載。

的問題是,在連接速度慢,所有的觀衆看到的是一個靜態的白色屏幕,因此可以關閉以爲它已經死了的頁面。如果我右鍵單擊SWF所在的區域,則Adobe Flash Player對象佔用了該空間,但第三方SWF尚未完成加載。

我想網站訪問者看到加載微調GIF或類似的東西。

不幸的是,第三方SWF都沒有「preloader」元素。而且它們不是開源的,所以我不能爲它們添加預加載器。

所以,我的問題是...

有沒有辦法顯示加載圖像,prefereably一個GIF動畫,而SWF加載?

例如,有沒有什麼辦法來迫使Adobe Flash Player才能顯示圖像它加載的SWF會嗎?

我沒有任何Flash編碼技巧,因此一個解決方案不包括在SWF中創建額外的SWF或SWF,對我來說可能不是最好的,但可能值得添加到該帖子中如果其他人有類似的問題。

我使用SWFObject 2.2嵌入的主權財富基金,使一個解決方案,這需要考慮或者至少不打破,這將有助於。

非常感謝您花時間閱讀我的文章,即使您無法提供幫助。

戴夫

+0

我想過使用jQuery在Flash對象的前面使用CSS的z-index添加的圖像,然後使用swfobject的callbackFunction參數刪除它一旦SWF已加載。過去我曾經做過這樣的工作,在SWF前放置一個Logo。但是,這涉及到使用Flash對象的「wmode」參數,並且存在可能或可能未解決的有關Flash和wmode參數的問題。我不記得這個問題是否與Flash版本或什麼瀏覽器有關,但這足以阻止我使用這種方法。 – David

回答

0

最後我們決定去混合設置:

對於具有低帶寬的用戶,我們將閃光參數WMODE爲「透明的」,並設置GIF是背景圖像(如果沒有加載調整器,這些低帶寬用戶認爲該頁面無所事事)。

但是,使用wmode = transparent會產生負面影響,因爲Flash不會使用硬件加速。但對於我們的低帶寬用戶來說,我們的視頻足夠低,在大多數情況下,他們並不需要硬件加速。

對於高帶寬用戶,我們提供更高比特率的視頻,所以硬件加速變得更加重要。對於這些用戶,我們使用wmode = direct,並且無需加載微調器GIF,因爲無論如何SWF加載速度足夠快。

由於我們的SWF文件及其XML文件的大小也必須加載,所以我們限制了1兆帶寬,如果用戶有更高的帶寬,我們不使用加載圖形和簽證反之亦然。其他人可能會發現更適合的其他級別。

如果可能的話,我們希望能夠將帶寬限制降低很多,就像在舊PC上一樣,我們可以使用一些384 kbit/s的Harware Acceleration,但刪除用戶的加載微調器如果像這樣的低帶寬將意味着他們等待時間過長,屏幕上沒有什麼讓人開心的事情,這比在視頻播放過程中丟失幾幀更糟糕。

以下是Adobe對各種wmode的描述以及不同瀏覽器如何處理它們的鏈接。

http://kb2.adobe.com/cps/127/tn_12701.html#main_BrowserSupportForWmodes

希望這有助於別人一天。

戴夫

0

不知道你使用的第三方主權財富基金也可能是艱難的,但這裏有一些事情要考慮:

一個辦法是隱藏SWF(或的div swf在裏面)直到它被加載,然後在它完成後顯示它。同時,您可以讓微調器/加載圖像坐在它的位置。也就是說,你真正需要的是一個JavaScript函數,一旦加載完成就會被調用。一旦發生這種情況,您可以分別使用jQuery到.show().hide()您的微調器和swf。

JWPlayer有一些events that you can make use of。它看起來像onReady會爲你做的伎倆。

至於其他的第三方主權財富基金,我想看看它們的文檔周圍類似的JavaScript回調。我知道swfobject has an onLoad callback,就像Swiff這樣的一些其他嵌入解決方案,假設你可以使用它們。

祝你好運!

編輯:當SWF已經成功嵌入式的swfobject的回調可能被稱爲不一定加載。你最好的選擇是玩弄這個,看看它是否有效 - 或儘可能使用第三方swf的回調函數。

編輯2:這裏是一個flash加載器的例子。

import flash.net.URLRequest; 
import flash.display.Loader; 
import flash.events.Event; 

function startLoad() { 
    var mLoader:Loader = new Loader(); 
    var mRequest:URLRequest = new URLRequest("url-to-your-swf.swf"); 
    mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler); 
    mLoader.load(mRequest); 
} 

function onCompleteHandler(loadEvent:Event){ 
    addChild(loadEvent.currentTarget.content); 
    //Here's where you specify your js function 
    ExternalInterface.call("flashLoaded"); // <-- where 'flashloaded' is a js function 

} 

startLoad(); 
+0

嗨Chazbot。我已經有了你的建議。首先,你的編輯看起來是正確的。看起來,只要OBJECT在頁面上(包含Adobe Flash Player)創建,swfobject就會觸發它的回調函數。即它在swf加載之前觸發,所以我不能使用這個回調函數。所以,我已經設法爲每個第三方swf找到onReady事件,並且與這些事情一起去了。 – David

+0

不幸的是,似乎使用jQuery的hide()函數本質上是一個CSS display:none,並且事實證明這會停止或阻止flash對象。 onReady事件不會觸發。在網上閱讀,似乎這甚至可能是設計。下面的帖子建議不要使用display:none,你可以將包含flash對象的div設置爲CSS width:1px;高度1px; overflow:hidden .... http://www.stoimen.com/blog/2009/04/14/load-flash-swf-in-hidden-div/ ....然後當onReady事件觸發時,設置尺寸可以恢復到全尺寸。 – David

+0

雖然這種方法已成功允許我在swf加載時顯示加載圖像,但對於使用Firefox Flashblock插件的用戶而言(這會阻止任何Flash播放,直到您按Flashblock播放按鈕) ,他們沒有看到Flashblock播放按鈕,因爲它在1px×1px的div內。這意味着這些用戶看起來像是網頁已損壞。 – David