亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

我對as3聲音架構的理解

系統 1562 0

一直都對as3的聲音架構設計感到困惑,as3為什么要把播放和停止方法分開呢?為什么不能用一個Sound更換載入的聲音呢?這幾天有空專門專研了一下。原來as3對聲音的設計也是深思熟慮的。目的不是為了把問題搞得復雜,而是為了在功能強化的同時做到精簡。并盡可能方便我們使用。現在把我這兩天的理解拿出來共享,有什么不到位的地方請多多建議。
[1b]架構圖:
[/1b]
[url=http://bbs.actionscript3.cn/attachment.php?aid=3966]

架構圖.jpg
[/url]
可以看出,as3中的聲音處理是獨立的,不再依賴影片剪輯作為聲道。as3使用多個類合作處理聲音,功能被細化到對應的類中,使得邏輯更加清晰。下面對著架構圖由下往上詳細闡述各個類所但當的任務。
Sound類負責創建、加載、播放聲音。Sound類更像BitmapData扮演的角色,用于描述數據。而不是控制聲音。使用Sound創建聲音有兩種創建方式:
[1b]1.[/1b][1b]通過庫中元件創建和載入[/1b]
庫中聲音是Sound的子類。要播放必須創建它們的實例。
[1b]2.[/1b][1b]通過外部加載的聲音[/1b]
外部加載聲音創建類型是Sound類本身。為強調一個類描述一個聲音數據這種模式,Sound禁止第二次加載外部聲音。加載控制符合open—progress—complete的標準。
Sound的構造函數為Sound(stream:URLRequest = null, context:SoundLoaderContext = null),創建外部聲音時與load方法參數相同。如果創建庫中的聲音則不需要任何參數。
[1b]方法:[/1b]
load(stream:URLRequest = null, context:SoundLoaderContext = null):void
加載聲音。不能使用一個Sound對象加載多個聲音。當有多聲音播放時,必須為每個聲音創建不同的Sound對象。
play(startTime:Number = 0, loops:int = 0, sndTransform:SoundTransform = null):SoundChannel
播放聲音。startTimer為開始播放事件,單位為毫秒。loops為循環次數,0和1都表示播放一次,如同flash屬性面板中的次數設置。sndTransform是分配給每個通道的初始對象,如果有必要還可以在soundChannel中修改這個對象。每次播放都會選擇不通的聲道,對應方法返回值。多次執行會導致重疊播放。
close():void
關閉聲音流。對于流式播放聲音,close很重要,因為soundChannel的stop方法不足以停止流式下載的聲音??赡墚a生繼續播放的現象。
[1b]事件:[/1b]
open:
類型為Event.OPEN。開始下載時觸發。
progress:
類型為PrograssEvent.PROGRESS。下載時觸發。
complete:
類型為Event.COMPLETE。下載完畢時觸發。
ioError:
類型為Event.IO_ERROR。發生IO錯誤時觸發。
id3:
類型為Event.ID3。可以訪問id3數據時觸發。
[1b]屬性:[/1b]
所有屬性都是只讀的,用來訪問加載信息。
url:String
加載聲音的url值。
bytesLoaded:uint
加載字節數。
bytesTotal:int
總字節數。
length:Number
當前聲音長度,如果加載中只反應加載的長度。
id3:ID3Info
id3屬性包含唱片信息。
[1b]加載播放外部聲音的順序:[/1b]
加載播放外部聲音的順序如下:


ID3Info類

ID3Info類用于描述聲音信息。對應Sound類的id3屬性。
[1b]
屬性:
[/1b]
songName:String
歌曲名稱。
track:String
曲目編號。
artist:String
歌手名稱。
album:String
專輯名稱。
yesr:String
錄制年份。
genre:String
歌曲流派。
comment:String
相關注釋。
[1b]
獲取唱片信息順序:
[/1b]
[url=http://bbs.actionscript3.cn/attachment.php?aid=3967]

獲取唱片信息.jpg
[/url]
SoundChannel類
SoundChannel繼承EventDispatcher,使用import flash.media.SoundChannel聲明。SoundChannel用于描述聲音通道。有了這個類,聲音通道再不用依賴MovieClip了。多個聲道可以播放一個聲音,一個聲道可以播放多個聲音(同一時刻只能播放一個)。對聲音的操控和狀態描述從描述聲音數據的Sound類中分離出來。聲道與聲音之間的關系類似Bitmap和BitmapData的關系。這種邏輯描述更加精確。但與位圖不同的是聲音通道不是由用戶創建的而是系統生成的。這個紐帶是Sound的play方法。采用這種處理方式是為了降低復雜性,因為系統自動管理聲道免去我們因聲道分配分散注意力。系統每次選擇空余聲道進行回放。當停止了一個聲道的播放后,聲道自動被as回收。這樣一來,我們完全不必去管聲道如何分配的,就如顯示對象的深度管理一樣。
[1b]方法:[/1b]
stop()
停止播放聲音。但不能停止流式下載時播放的聲音。
[1b]屬性:[/1b]
position:Number
播放頭位置,單位毫秒。只讀屬性。這表示position并不能設置播放進度。要設置播放進度只能使用play的參數。
leftPear:Number
左聲道音量。范圍為0-1。這個屬性并不用來控制平移而是用來讀取左聲道峰值波幅??梢杂眠@個屬性檢查是否是單聲道。
rightPear:Number
右聲道音量。范圍為0-1。這個屬性并不用來控制平移而是用來讀取右聲道峰值波幅??梢杂眠@個屬性檢查是否是單聲道。
soundTransform:SoundTransform
分配給聲道的soundTransform對象。
[1b]事件:[/1b]
soundComplete
類型為Event.SoundComplete。聲音播放完畢后觸發。
[1b]監視和設置聲音播放進度:[/1b]
[1b]監視播放進度:[/1b]
對于下載完畢的聲音可以使用position監視播放進度。但對于正在下載中的聲音雖然position可以正常訪問,但length屬性只能在下載完畢后才能獲取,這給監視播放進度造成了困難。這時可以通過bytesLoaded和bytesTotal的比值估算出長度。公式為:position*bytesTotal/bytesLoaded。
[1b]設置播放進度:[/1b]
由于position屬性是只讀的。因此不能通過它設置播放進度。設置播放進度只能通過play方法的startTime參數。這是因為考慮到功能重復。采取這種邏輯還有個長處是不必管播放的狀態。方法也只有播放和停止而沒有暫停方法。少了一個狀態和方法后,播放進度不必管是否播放或暫停。所以免去了playState屬性。position的只讀特性也避免設置進度時是否要保持播放或暫停狀態?,F在一切都被簡化成播放和停止兩個方法了。邏輯大大簡化。而暫停和設置進度都由播放和停止兩個方法衍生出來。方法如下:
設置進度=stop+play(startTime)
暫停播放=記錄position+stop
恢復播放=play(記錄position)
SoundTansform類
SoundTransform
SoundMixer類繼承Object。使用import flash.media.SoundMixer聲明。由于不使用MovieClip綁定聲音通道。所以描述全局聲音通道的不是主時間軸而是SoundMixer類。由于與任何聲道無關,所以SoundMixer是個靜態類。
[1b]
屬性:
[/1b]
SoundMixer.bufferTime:int
全局緩沖時間。如果在Sound類的play方法中未指定緩沖則由這里決定。
SoundMixer.soundTransform:SoundTransform
全局SoundTransform對象??刂瓶傮w聲音效果。當應用了單個sound的soundTransform屬性后再應用總聲音特效。比如對于音量控制而言,這里是總音量控制。
[1b]
方法:
[/1b]
SoundMixer.stopAll():void
停止所有通道播放聲音。
SoundMixer.areSoundsInaccessible():Boolean
如果聲音因為安全模型不能訪問則返回true.
SoundMixer.computeSpectrum(outputArray:ByteArray, FFTMode:Boolean = false, stretchFactor:int = 0):void
返回當前組合音頻快照。波形被分為256級,分為左聲道和右聲道。被記錄在outputArray中。outputArray是個二進制數組,擁有512個元素,類型為Numer。使用readFloat方法訪問。前256個浮點數描述左聲道的波形,后256個浮點數描述右聲道的波形。浮點數也分為兩種描述類型,FFTMode參數為true時使用頻譜形式描述。范圍為0~2的平方根。為false時采用波形描述,范圍為-1~1。strechFactor是采樣率。0為44HZ,1為22.HZ,以此類推。不管采樣率為多少,始終都是256級別。采樣率只會影響波形是否平滑。
[1b]
生成播放特效:
[/1b]
很多時候我們很羨慕media player的視覺特效吧。也很想知道是怎么做出來的。答案就是兩個字——算法?,F在利用as3提供的computeSpectrum可以實現我們的夢想,這是在as2中做不到的。下面我們來看看實現的原理。
不管使用什么算法,數據都是相同的。我們可以寫一段小代碼,輸出某個音樂播放中的浮點狀態。
導入一首歌曲,庫中類名改為Song。在幀上輸入如下代碼:
var s:Song=new Song();
s.play();
var ba:ByteArray=new ByteArray();
stage.addEventListener(MouseEvent.CLICK,onClick);
function onClick(event:MouseEvent):void
{
SoundMixer.computeSpectrum(ba);
ba.position=0;
for(var i:int=0;i
{
var num:Number=ba.readFloat();
trace(num);
}
}
看到數據的組織結構后,下一步就可以發揮你編程與藝術的完美結合,而media player中的特效就是完美最好的榜樣。在這么多另人眼花繚亂的效果中,條形與波形是最直接最簡單的可視效果,它是數組的直接透視?,F在我們來看看FFTMode為true和false時的波形區別。
用于控制聲音的音量和平移。它跟多個類有聯系,如:Microphone、NetStream、SoundChannel、SoundMixer都通過它調節聲音效果。再次顯示了聲音架構的標準統一。更可貴的的是在SimpleButton和Sprite中也有這個屬性。這代表著可以通過as調整flash 工具創作的按鈕和影片剪輯中嵌入的聲音。這種操控能力使得我們不必因為嵌入的聲音對應調整音量上的干擾。但這并不代表我們能控制幀中聲音的播放和停止。SoundTransform的構造函數為new SoundTransform(vol:Number=1,panning:Number=0)。構造函數的參數是它的屬性。
[1b]
屬性:
[/1b]
volume:Number
音量,范圍為0~1。
pan:Number
聲道平移,范圍為-1~1。
leftToLeft:Number
左輸入在左聲道中的音量。
leftToRight:Number
左輸入在右聲道中的音量。
rightToLeft:Number
右輸入在左聲道中的音量。
rightToRight:Number
右輸入在右聲道中的音量。
SoundMixer類
[url=http://bbs.actionscript3.cn/attachment.php?aid=3954]

[/url]
[1b]快速傅立葉變換:
[/1b]快速傅氏變換,是離散傅氏變換的快速算法,它是根據離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。它對傅氏變換的理論并沒有新的發現,但是對于在計算機系統或者說數字系統中應用離散傅立葉變換,可以說是進了一大步。
設x(n)為N項的復數序列,由DFT變換,任一X(m)的計算都需要N次復數乘法和N-1次復數加法,而一次復數乘法等于四次實數乘法和兩次實數加法,一次復數加法等于兩次實數加法,即使把一次復數乘法和一次復數加法定義成一次“運算”(四次實數乘法和四次實數加法),那么求出N項復數序列的X(m), 即N點DFT變換大約就需要N2次運算。當N=1024點甚至更多的時候,需要N2=1048576次運算,在FFT中,利用WN的周期性和對稱性,把一個N項序列(設N=2k,k為正整數),分為兩個N/2項的子序列,每個N/2點DFT變換需要(N/2)2次運算,再用N次運算把兩個N/2點的DFT 變換組合成一個N點的DFT變換。這樣變換以后,總的運算次數就變成N+2(N/2)2=N+N2/2。繼續上面的例子,N=1024時,總的運算次數就變成了525312次,節省了大約50%的運算量。而如果我們將這種“一分為二”的思想不斷進行下去,直到分成兩兩一組的DFT運算單元,那么N點的 DFT變換就只需要Nlog2N次的運算,N在1024點時,運算量僅有10240次,是先前的直接算法的1%,點數越多,運算量的節約就越大,這就是 FFT的優越性.
這就是快速傅立葉轉換的原理,但若頻繁的把波形轉化成頻譜,除了算法上的處理,還會會消耗一定的cpu資源,這就是as3直接提供了波形和頻譜兩種浮點模式的原因。
[1b]創建自定義播放效果:[/1b]
下面一個是我用矢量生成的一個特效。實際上還可以使用位圖,甚至結合flash工具創建的動畫來制作特效。可以說這方面的發揮空間是無窮無盡的。這里我使用256條線段來描述聲道的波幅,使用25層來描述場密度。效果如下:
點擊下載此效果。
[url=http://bbs.actionscript3.cn/attachment.php?aid=3956]

image007.jpg
[/url]
?

[url=http://bbs.actionscript3.cn/attachment.php?aid=3978][1b]
水紋效果.rar
[/1b][/url]
(2008-05-12 18:15:40, Size: 24.8 KB, Downloads: 6)
說明:由于嵌入聲音造成文檔太大,所以載入百度中的歌曲。歌曲地址放在界面文本框中又會影響美觀,所以我在路徑下放了一個songURL.txt的文本。大家可以更改網址。但同時訪問本地和網絡又會造成安全問題。于是找來我的flashBox。flashBox可不管什么沙箱,本地網絡通吃。而且全屏播放又能加快執行速度??梢援斪髌帘R粯印U媸呛苓m合呢。
另外由于是矢量制作的因而不可能使得密度到達media player中水紋那樣的效果,我們可以使用BitmapData來達到。但以像素級來描述波形將會更慢。因為flash player是不能象c++那樣調用系統API的。也不能直接使用顯卡支持的driectX或openGL。無法直接操作顯存。即便如此,我還是要說說使用BitmapData代替矢量呈現的方法。原理并不是很困難。使用矢量只不過是繪制線條。我們可以寫一個使用位圖創建線條的函數。原理如下:想象線段是一條路徑,一個爬蟲從一段爬到另一端,走過的路徑使用像素填充。這樣一來就非常簡單了。結合Tween來進行像素填充,為位圖創建一個lineTo函數,代碼改動基本上不大。詳細代碼我就不寫了。請大家自己嘗試。
以上是我對as3架構的理解,不到之處還請見諒。謝謝!
本文轉自:http://www.5uflash.com/flashjiaocheng/Flash-as3-jiaocheng/3243.html

我對as3聲音架構的理解


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 激情伊人网 | 精品视频在线免费 | 又黄又爽又色的免费毛片 | 青青草免费在线视频 | 国产精品热久久毛片 | 久久99在线 | 久久99精品久久久久久臀蜜桃 | 一级毛片一级毛片一级毛片aa | 日本一级毛片视频在线看 | 欧美日韩亚洲综合久久久 | 日韩毛片大全 | 91热久久免费频精品99欧美 | 国产色婷婷亚洲 | 日本亚洲一区二区三区 | 亚久久| 成年美女 | a亚洲欧美中文日韩在线v日本 | 亚洲日本在线观看 | 国产99久久亚洲综合精品 | 精品乱人伦一区二区三区 | 在线观看欧洲成人免费视频 | 99久久香蕉国产线看观香 | 好吊色青青青国产欧美日韩 | 国产对白有声小说 | 国产精品久久久久桃色tv | 久久不射网 | 色综合久久中文综合网 | 亚洲欧洲日本在线 | 国产精品欧美在线观看 | 国产三及 | 亚洲天堂国产精品 | 国产一区二区影院 | 日韩在线看片 | 天天干天天操天天透 | 中文字幕51精品乱码在线 | 久久久久国产一级毛片高清板 | 真实国产精品视频国产网 | 久久国产色 | 国产成人h片视频在线观看 国产成人h综合亚洲欧美在线 | 亚洲涩涩视频 | 久久国产香蕉视频 |