a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 辦公 > Flash > 正文

as3 加載外部聲音文件問題詳細剖析

2020-07-17 13:14:45
字體:
來源:轉載
供稿:網友
在AS3中使用聲音跟AS2有很大的不同。先看下Flash幫助中的一些介紹,然后我們再使用導入到Flash中的聲音做個小測試。

理解聲音的結構
應用程序可以從4個地方加載聲音:
運行時從外部聲音文件里加載
內嵌到SWF文件里的聲音資源
從連接到用戶系統的麥克風上獲取聲音數據
從遠程多媒體服務器,比如Flash Media Server獲取聲音流
可以等到聲音全部加載后再播放,也可以邊加載邊播放。
ActionScript 3.0和Flash Player支持以mp3格式存儲的聲音。它們不能直接加載或播放其他格式的聲音,比如WAV或AIFF。
使用Adobe Flash CS3 Professional,可以導入WAV或AIFF格式的聲音,然后就可以把它們以MP3的格式嵌入到SWF文件中。Flash開發工具可以壓縮嵌入的聲音文件以減少文件大小,不過這樣需要以降低聲音質量的代價。更多信息查看 "Importing Sounds" in Using Flash.
ActionScript3.0聲音使用flash.media包中的下列類

描述

flash.media.Sound

Sound類用來加載聲音,管理聲音的基本屬性以及使聲音開始播放

flash.media.SoundChannel

當程序播放一個聲音對象的時候,會創建一個新的SoundChannel對象控制播放。SoundChannel對象同時控制聲音的左右頻道。每個播放的聲音都有自己的SoundChannel對象。

flash.media.SoundLoaderContext

SoundLoaderContext類指定當加載一個聲音的時候使用多少秒的緩沖區,以及從服務器加載文件的時候FlashPlayer是否查找跨域策略文件。SoundLoaderContext對象作為Sound.load() 方法的參數使用。

flash.media.SoundMixer

SoundMixer類控制程序中所有聲音的回放及安全屬性。實際上,多個聲音頻道通過一個共同的SoundMixer對象混合在一起,因此,SoundMixer對象的屬性會影響正在播放的所有SoundChannel對象。

flash.media.SoundTransform

SoundTransform類包含用于控制音量和平衡的值。SoundTransform對象可以應用到一個單獨的SoundChannel對象,全局的SoundMixer對象或者一個Microphone對象。

flash.media.ID3Info

ID3Info對象包含mp3文件中的ID3元數據信息。

flash.media.Microphone

Microphone類表示連接到用戶電腦上的麥克風或者其他聲音輸入設備。從麥克風輸入的音頻可以傳送到本地喇叭上或者遠程服務器上。Microphone對象控制它自己聲音流的取樣率。


每個加載和播放的聲音都需要它自己的Sound類和SoundChannel類。從多個SoundChannel實例輸出的聲音在播放中通過全局的SoundMixer混合在一起。
Sound,SoundChannel和SoundMixer類不能用在從麥克風或者流媒體服務器獲取的聲音上。
加載外部聲音文件
Sound類的每個實例都用來加載和回放指定的聲音。應用程序不能重復使用一個Sound對象加載多于一個的聲音。如果想加載一個新的聲音,需要創建一個新的聲音對象。
如果加載一個小的聲音文件,比如要附加在按鈕上的點擊聲音,可以像下面這樣創建一個新的Sound,然后讓它自動加載聲音文件:
ActionScript Code:

復制代碼
代碼如下:

var req:URLRequest = new URLRequest("click.mp3");
var s:Sound = new Sound(req);

Sound()構造函數使用一個URLRequest對象作為第一個參數。當指定了URLRequest參數的時候,Sound對象就開始自動加載指定的聲音文件。
除了這個最簡單的情況之外,應用程序都應該注意聲音的加載過程并監視加載過程中出現的錯誤。比如,如果這個點擊聲音特別的大,可能在用戶點擊按鈕觸發這個聲音的時候這個聲音文件還沒有完全加載完。試圖播放一個未加載完的聲音可能導致一個運行期錯誤。安全的做法是等聲音完全加載后再允許用戶的那些可能導致聲音播放的行為。
在聲音加載過程中,Sound對象會發送幾個不同的事件。應用程序可以監聽這些事件來跟蹤加載過程以確保聲音在完全加載后才能播放。下表列出了聲音對象可能發送的事件。

事件

描述

open (Event.OPEN)

在聲音加載操作剛開始時發送。

progress (ProgressEvent.PROGRESS)

當從文件或者流中接收到數據的時候周期性的發送。

id3 (Event.ID3)

當一個mp3聲音的ID3數據可用時發送。

complete (Event.COMPLETE)

當聲音的所有數據加載完后發送。

ioError (IOErrorEvent.IO_ERROR)

如果聲音文件不能定位或者加載過程中在所有數據接收完之前被中斷的時候發送。


下面的代碼演示了如何在聲音加載完后播放一個聲音:
ActionScript Code:

復制代碼
代碼如下:

import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var s:Sound = new Sound();
s.addEventListener(Event.COMPLETE, onSoundLoaded);
var req:URLRequest = new URLRequest("bigSound.mp3");
s.load(req);
function onSoundLoaded(event:Event):void
{
var localSound:Sound = event.target as Sound;
localSound.play();
}

首先,這段示例代碼創建了一個新的Sound對象,但并沒有指定URLRequest參數。然后,它監聽Sound對象的Event.COMPLETE事件,當所有聲音數據加載完后執行onSoundLoaded()方法。接下來,它使用一個新的URLRequest值調用Sound.load()方法。
當聲音全部加載完后執行onSoundLoaded()方法。Event對象的target屬性是Sound對象的引用。調用Sound對象的play()方法開始播放聲音。
監視聲音加載過程
聲音可能非常大,加載需要相當長的時間。FlashPlayer允許在聲音全部加載完前就能播放,你可能想想給用戶一個顯示聲音加載了多少以及播放了多少。
Sound類的兩個事件使得顯示加載進度變得相當容易: ProgressEvent.PROGRESS和Event.COMPLETE. 下面的代碼展示了如何使用這些事件顯示聲音的加載進度:
ActionScript Code:

復制代碼
代碼如下:

import flash.events.Event;
import flash.events.ProgressEvent;
import flash.media.Sound;
import flash.net.URLRequest;
var s:Sound = new Sound();
s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
s.addEventListener(Event.COMPLETE, onLoadComplete);
s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
var req:URLRequest = new URLRequest("bigSound.mp3");
s.load(req);
function onLoadProgress(event:ProgressEvent):void
{
var loadedPct:uint = Math.round(100 * (event.bytesLoaded / event.bytesTotal));
trace("The sound is " + loadedPct + "% loaded.");
}
function onLoadComplete(event:Event):void
{
var localSound:Sound = event.target as Sound;
localSound.play();
}
function onIOError(event:IOErrorEvent)
{
trace("The sound could not be loaded: " + event.text);
}

這段代碼首先創建了一個Sound對象,然后為事件ProgressEvent.PROGRESS和Event.COMPLETE添加監聽器。在調用了Sound.load()方法及收到第一組數據后,開始出現ProgressEvent.PROGRESS事件,觸發onSoundLoadProgress() 方法。
聲音加載的百分比等于ProgressEvent對象的bytesLoaded屬性除以bytesTotal屬性。在Sound對象上同樣可以獲取bytesLoaded和bytesTotal。上面的代碼簡單展示了聲音加載信息,但是你可以使用bytesLoaded和bytesTotal值來控制進度條組件。
這段代碼同樣展示了如何組織和響應加載中發生的錯誤。比如,如果無法定位指定的聲音文件,會發送Event.IO_ERROR事件。前面代碼中當發生錯誤時會調用onIOError()方法顯示簡單的錯誤信息。

使用嵌入的聲音
好了,下面我們把聲音導入到庫里使用。
打開Flash CS3,選擇文件->導入到庫,選擇好聲音,然后確定后會導入聲音。打開庫面板,找到我們導入的聲音,右鍵,選擇”linkage…”菜單
< XMLNAMESPACE PREFIX ="V" />
會彈出如下框,選擇Export for ActionScript注意觀察這個彈出框
它與AS2中明顯不同的是,標識符欄(identifier欄)不能填寫,而類(Class)和基類(Base class)欄必須填寫。類的名字默認是聲音的文件名,但是名字中只能能有字母數字,且以字母開頭,因此圖中的名字01.mp3是不合格的,可以改為mp3或其他符合規則的名字。基類就是flash.media.Sound。我們點確定,會彈出下框:
大意是指定的類”mp3″在類路徑下找不到,在SWF文件導出時會自動為你創建一個類。點確定就可以了。

在幀上寫如下代碼
ActionScript Code:

復制代碼
代碼如下:

var drum:mp3 = new mp3();
var channel:SoundChannel = drum.play();

導出,就可以聽到聲音了。
[as3]播放聲音
播放一個加載的聲音可以簡單的調用Sound對象的Sound.play()方法,就像下面這樣:
ActionScript Code:

復制代碼
代碼如下:

var snd:Sound = new Sound(new URLRequest("smallSound.mp3"));
snd.play();

當使用ActionScript3.0播放聲音的時候,你可以實現下列操作:
從一個指定的位置播放聲音(不一定是最開始)
暫停聲音,然后從暫停的位置處重新開始播放
可以精確的知道聲音什么時候播放完了
跟蹤聲音的播放進度
當聲音播放的時候改變音量或者均衡
要在播放過程中實現這些效果,使用SoundChannel, SoundMixer, 和 SoundTransform 類.
SoundChannel控制一個單獨的聲音的播放.SoundChannel.position屬性可以被當作播放頭,用來指示數據播放的位置.
當程序調用Sound.play()方法時,會創建一個新的SoundChannel實例來控制播放.
程序可以為Sound.play()方法指定它的startTime參數,該參數接收以毫秒為單位的數字,這樣就可以使聲音從指定的位置開始播放.
如果同時指定了Sound.play()方法的startTime參數和loops參數,那么當聲音會從相同的起始位置重復播放就像下面這樣:
ActionScript Code:

復制代碼
代碼如下:

var snd:Sound = new Sound(new URLRequest("repeatingSound.mp3"));
snd.play(1000, 3);

在這個例子中,聲音會接連從離開始1秒的位置播放3次.
暫停和重新開始聲音
如果你的程序播放一個長聲音,比如一首歌或者播客(podcasts,暫譯為播客),你可能想允許用戶可以暫停,然后繼續播放這個聲音.然后聲音并不能像字面意思那樣實現暫停,它只能停止(從字面意思上來講,暫停跟停止是不同的,我們想實現暫停效果,但是沒有直接的ActionScript語句可以實現暫停).但是,聲音可以從任何位置處播放.因此你可以記錄下它停止的位置,然后從這個位置后面開始播放,就實現了暫停效果.
比如,首先像下面這樣加載并播放一個聲音:
ActionScript Code:

復制代碼
代碼如下:

var snd:Sound = new Sound(new URLRequest("bigSound.mp3"));
var channel:SoundChannel = snd.play();

當聲音播放的時候SoundChannel.position屬性顯示聲音當前的播放位置.程序可以像下面這個例子一樣,在停止它之前記錄下它的位置:
ActionScript Code:

復制代碼
代碼如下:

var pausePosition:int = channel.position;
channel.stop();

要重新播放聲音,傳遞之前記錄的播放位置數據來使聲音從它停止的地方重新開始播放.
ActionScript Code:

復制代碼
代碼如下:

channel = snd.play(pausePosition);

監視播放
你的程序可能需要知道什么時候它停止了播放,以便去播放另一個聲音,或者清除在播放過程中使用的一些資源.當聲音播放完畢的時候SoundChannel類發送一個Event.SOUND_COMPLETE事件. 你的程序可以監聽這個事件并作出適當的動作,就像下面這樣:
ActionScript Code:

復制代碼
代碼如下:

import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound("smallSound.mp3");
var channel:SoundChannel = snd.play();
s.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
public function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
}

SoundChannel類在播放中并不發送進度事件.要報告播放進度,你可以自己設置一個時間進制并跟蹤播放頭的位置.
可以使用SoundChannel.position屬性值除以聲音長度來計算已播放的百分數:
ActionScript Code:

復制代碼
代碼如下:

var playbackPercent:uint = 100 * (channel.position / snd.length);

但是,只有在播放前聲音全部加載完了,這段代碼才能精確顯示播放的百分比.Sound.length屬性顯示的是當前已加載的聲音長度,而不是聲音文件的的真實長度.你可以使用Sound對象的bytesLoaded和bytesTotal屬性估計聲音的長度:
ActionScript Code:

復制代碼
代碼如下:

var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);

下面的代碼加載一個比較大的聲音文件,并使用Event.ENTER_FRAME事件作為顯示播放進度的時間機制.它周期性的報告播放的百分比,這個百分比是用當前位置除以聲音總長度計算出來的:
ActionScript Code:

復制代碼
代碼如下:

import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound();
var req:URLRequest = new
URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");
snd.load(req);
var channel:SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
function onEnterFrame(event:Event):void
{
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint =
Math.round(100 * (channel.position / estimatedLength));
trace("Sound playback is " + playbackPercent + "% complete.");
}
function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}

在開始加載聲音數據后,調用方法snd.play()并把結果保存在類型為SoundChannel,名子為channel的變量中. 然后為主程序添加了Event.ENTER_FRAME事件的監聽器,為SoundChannel對象的Event.SOUND_COMPLETE事件也添加了監聽器.
在動畫中每到達一個新幀的時候,onEnterFrame()方法就會被調用.onEnterFrame()根據已經加載的數據估算聲音的總長度,然后顯示當前播放的百分數.
當整個聲音播放完后,會執行onPlaybackComplete()方法,移除Event.ENTER_FRAME事件的監聽器,因為播放完后就不需要在報告播放進度了.
Event.ENTER_FRAME事件每秒會發送好幾次.在某些情況下,你可能不想發送的這么頻繁.那么,你就可以使用flash.util.Timer類設置自己的時間機制.

停止流聲音
流聲音(指的是在完全加載之前就播放的聲音)在播放過程中有一個特點需要注意.當你的程序調用SoundChannel.stop()方法的時候,聲音會停止一幀,而在下一幀它會從開始的地方重新開始播放. 之所以發生這種情況,是因為聲音仍然在加載中.要停止加載和播放,使用Sound.close()方法.
解決聲音以數據流形式放到時間軸上導出后音質變差的問題
[關鍵字]Flash 數據流 聲音 音質變差 立體聲轉換成單聲道
[問題描述]:將聲音放到時間軸上,選擇數據流的同步方式,在Flash中聽聲音沒有發現問題,但是導出后音質變的奇差,基本上不能用,雖然將聲音同步方式選擇開始或者事件可以解決這個問題,但是有時是非要用數據流同步方式不可的(因為要用播放暫停控制,因為有進度條控制)。
[解決辦法]:這是由于在導出時,Flash會以MP3的形式壓縮聲音,一般會把聲音壓縮成比特率低于22Kbps的聲音,同時將立體聲轉換成了單聲道聲音,很多聲音都是因為將立體聲轉換成單聲道后音質變差的。因此我們要去掉次選項。
如果Flash中有很多聲音,那么我們要更改發布設置。
1、打開發布設置,點開”Flash”選項卡,找到音頻流設置的項,如下圖
2、點開設置按鈕,
3、將比特率選擇24kbps(或者其他的高于22kbps的項,因為只有這樣才能更改”將立體聲轉換成單聲道”)
4、勾掉”將立體聲轉換成單聲道”前面的勾,然后確定就可以了
然后再導出,基本上就沒有問題了。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人国产精品一级毛片视频 | 国产成人精品国内自产拍免费看 | 久草 在线 | 国产精品美女久久 | 国产欧美日本 | 欧美成人一区二区 | 天天操天天插天天干 | 在线免费av观看 | 成人精品视频一区二区三区 | 国产精品二区三区 | 国产精品久久久久久久午夜片 | 91一级 | 成人黄色小视频 | 欧美人人 | 日韩欧美国产一区二区 | 污网站在线观看免费 | 欧美精品免费在线观看 | 日韩成人在线网站 | 中文字幕日韩久久 | 波多野结衣一区在线观看 | 成人免费crm一区二区 | 国产精品一区二区精品 | 黄色视频a级毛片 | 国产精品一区二区三区在线 | 九色91视频 | 国产成人精品高清久久 | 九九久久精品 | 91精品一区二区三区久久久久久 | 一区二区亚洲 | 亚洲三级网站 | 九色欧美 | 中文av电影 | 亚洲精品色 | 91精品国产综合久久精品 | 日日干夜夜干 | h黄动漫日本www免费视频网站 | 在线观看日韩av | 免费精品| 久久久免费观看 | 久久毛片| 热久久免费视频 |