Flash聲音進階篇:NullSound技術-1
最後更新:2017-02-28
來源:互聯網
上載者:User
進階 原文出處:http://www.bluegelmedia.com
原作者:Brett E. Yokom / killersound, Inc
翻譯:Jimbob
概要
本書介紹“NULLSOUND”stream技術的詳細說明。該技術可以比傳統的聲音stream技術節約90%的檔案體積大小,並保持聲音和動畫完全同步。
序言
我們先從Macromdeia Flash原有的技術的總覽開始講,後面再來描述具體實現的方法。
現在的互連網中,動畫網站正在迅速的增長。人們已經不再滿足於使用奇特的向量造型,漂亮的顏色和動畫,你還必須創造很酷的音樂和音效來吸引訪問者的注意。以前的Flash設計師(1998/1999)只是利用簡單的迴圈音效來打破沉默的web世界,接著,這些迴圈音效變得越來越複雜,結果造成了檔案體積增大,增加了下載的時間。同時,市場上也產生了這樣的需求:一些優秀的動畫(例如在電視上播放的廣告),要求映像必須和音樂以及音效完全同步。但是Flash裡面的聲音,能同時滿足這些要求麼:既要小檔案體積,又要和映像同步?Macromedia 提供的解決方案就是把聲音設定成Stream方式。
這種方式是很有用的,基於以下兩個方面原因:
1.Flash 播放器不需要一直等到所有的聲音全部下載完成才繼續播放,只要下載一部分預先緩衝的聲音,就可以馬上開始播放了。這有點類似於Real以及Microsoft media player用的流媒體技術。這項技術在寬頻接入的互連網使用者上表現很好,但是對56k以及以下撥號使用者,則會出現問題: 這些使用者可以在flash沒有完全下載時開始觀看,但是隨時都可能因為頻寬不夠而造成動畫的停止,最好是等所有的都全部下載完以後,再開始播放它。
2.使用stream方式可以保持絕對的播放幀率。 如果你不使用stream方式,設定flash 的fps幀率設定為25,那麼這並不意味著Flash將一直以25幀/秒的速度播放,實際的幀率將取決於你的CPU,CPU越強,則實際播放幀率越接近於預設的值。舉個例子說就是你在奔騰166機器上播放的幀率為8~9,而用奔III-500播放的幀率則達到22。理論上講,如果你設定幀率為25,那麼CPU只有1/25秒的時間來計算播放一幀所需要的所有元素。如果CPU的速度達不到這個要求,比如它可能花上1/5秒的時間來計算,那麼實際的fps就會降低為 5 fps,如果你的Flash包含100幀,那麼理論上播放完只要4秒,而實際上播放需要20秒,flash播放變慢了。
解決方案就是使用stream方式的聲音!在主時間軸上使用stream方式的聲音,將告訴flash播放器:“你必須保持聲音的播放速度,播放變慢是不允許的!” 結果,不但聲音,圖形的播放速度也一樣保持了同步。那麼一個速度低的CPU能用25的幀率處理完所有的資料嗎?答案是: 不可能。 速度的保持是虛擬,CPU採用忽略未處理的幀來保持幀率的穩定,例如上面提到的例子,用這種方式處理的話,Flash中只有1/5的幀能被顯示,其他都被忽略了(這樣在某些情況下,可能造成明顯的跳幀現象)。
在本書裡,我們並不想專門來討論如何使用聲音的event方式或者stream方式,介紹這類的文章可以在 www.macromedia.com或者 www.flashmagazine.com 等地方找到。我們所感興趣的是:如何更深入的應用這些知識。
方法說明:
採用聲音的stream方式,有個主要的缺點:它非常的增加檔案體積大小。 這個是由於stream技術本身造成的。如果你使用一個2秒的聲音,迴圈100次,那麼聲音的總長度為200秒,我們用stream方式匯入這200秒的聲音。如果聲音的原始大小為10k,那麼輸出的swf檔案將包括大約1M的聲音,這是估計值,考慮到聲音的品質以及一些其他的因素,它的實際大小應該是800~900k。如果用56k撥接的平均下載速度4.5k來考慮,使用者需要大概200秒(超過3分鐘)的時間來下載。如果考慮更低的上網速度比如2.5k,那麼需要大概5~6分鐘才能下載完.
於是得出結論:檔案大小是個大問題.
一個有趣的現象就是,如果我們使用比較小的聲音來使用stream方式,那麼最後輸出的swf檔案大小將會小很多。如果整個音樂是採用killersound教程裡使用的技術(www.killersound.com),那麼採用一個音效檔(比如最小的那個)作為stream方式而其他音效檔使用event方式就已經足夠了。經過多次測試,我們得到以下的結論:利用layer將其中一個音效檔設定成stream,其他音效檔則不設定為sream方式,效果是完美的。這也意味著Flash可以作為一個混音器來使用。
那麼我們怎樣才能更深層次的減少檔案體積呢?如果我們選擇壓縮聲音品質(比如: ADPCM, 5 kHz, 4 bit)結果將不會讓我們滿意。檔案體積是小很多了,但是聲音效果太差了! 解決方案就是下面的 str0 以及 str00 技術,這就是我們所謂的 "NULLSOUND STREAMING" 技術。
在開始講述這項技術之前,讓我們來看一看比較結果:
應用這項技術最明顯的例子就是 killersound 為虛擬現實開發的標題上。 這個標題包含了1分鐘的複雜音樂和音效。使用了5個音效檔,每個檔案都有不同的壓縮位元從而達到整體的音質要求。在這個例子裡,背景音樂只需要8kbit/s的mp3檔案(因為裡麵包含了主要的低頻部分),高頻的鼓聲等部分則需要32kbit/s的mp3檔案。根據我們後面要介紹的技術,我們還需要使用一個0.1秒長的"NULLSOUND"檔案。因為我們需要保持動畫和聲音的同步,標題的幀率必須恒定,這就意味著我們必須採用stream方式。
在傳統的方式中,只有一個或者所有的聲音全部都被設定成stream方式,這樣的話,stream聲音本身的位元速率必須設定的很高以滿足某些音質的需求,這也意味著我們浪費了不少的空間。採用新的NULLSOUND stream技術的話,我們可以為每個音效檔設定不同的位元速率,從而保證檔案變小。
下面的表格中顯示了標題在不同技術下面的輸出檔案大小。 str1和str5採用了傳統的方式,str0和str00則採用了新技術。需要提到的是,檔案不但包含了音樂,也包含了動畫,所以檔案體積比較大。
str1 : 1個迴圈音效設定成 STREAM音質為MP3, 48 kbit/s, MONO,其他音效設定成EVENT音質為根據不同音效分別設定不同的最佳化值
結果:音樂大小 595 KB (檔案大小 1.25 MB )
str5 : 5個音效全部設定成 STREAM音質為MP3, 48 kbit/s, MONO
結果音樂大小 594 KB (檔案大小 1.24 MB )
str0 : "NULLSOUND"音效設定為streamed 音質為 MP3, 8 kbit/s, MONO, 其他音效設定為EVENT音質為根據不同音效分別設定不同的最佳化值
結果:音樂大小 192 KB ! (檔案大小 847 KB )
str00: "NULLSOUND"音效設定為streamed 音質為 MP3, 8 kbit/s, MONO, 其他音效設定為EVENT音質為根據不同音效分別設定不同的最佳化值
結果:音樂大小 59 KB !!! (檔案大小 714 KB )