亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 辦公 > 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中聽聲音沒有發現問題,但是導出后音質變的奇差,基本上不能用,雖然將聲音同步方式選擇開始或者事件可以解決這個問題,但是有時是非要用數據流同步方式不可的(因為要用播放暫??刂疲驗橛羞M度條控制)。
[解決辦法]:這是由于在導出時,Flash會以MP3的形式壓縮聲音,一般會把聲音壓縮成比特率低于22Kbps的聲音,同時將立體聲轉換成了單聲道聲音,很多聲音都是因為將立體聲轉換成單聲道后音質變差的。因此我們要去掉次選項。
如果Flash中有很多聲音,那么我們要更改發布設置。
1、打開發布設置,點開”Flash”選項卡,找到音頻流設置的項,如下圖
2、點開設置按鈕,
3、將比特率選擇24kbps(或者其他的高于22kbps的項,因為只有這樣才能更改”將立體聲轉換成單聲道”)
4、勾掉”將立體聲轉換成單聲道”前面的勾,然后確定就可以了
然后再導出,基本上就沒有問題了。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
这里精品视频免费| 理论片在线不卡免费观看| 91青草视频久久| 91精品国产99久久久久久| 亚洲人精选亚洲人成在线| 在线观看久久av| 成人乱人伦精品视频在线观看| 欧美一级淫片aaaaaaa视频| 欧美日韩激情视频| 久久久久久久久久国产精品| 欧美色xxxx| 欧美孕妇孕交黑巨大网站| 欧美亚洲另类在线| 欧美天堂在线观看| 亚洲福利在线视频| 成人激情电影一区二区| 欧美激情网友自拍| 国产精品69精品一区二区三区| 在线中文字幕日韩| 亚洲图片欧美日产| 孩xxxx性bbbb欧美| 欧美精品激情视频| 久久久免费电影| 日韩av三级在线观看| 久久久精品国产一区二区| 亚洲一区二区三区成人在线视频精品| 国产精品白嫩美女在线观看| 中文字幕成人在线| 色爱精品视频一区| 狠狠色狠狠色综合日日小说| 国产精品夜间视频香蕉| 欧美色欧美亚洲高清在线视频| 91免费高清视频| 久久成年人免费电影| 91成人在线播放| 久久久久久中文| 亚洲精品国产拍免费91在线| 亚洲美女在线观看| 欧美日韩成人在线播放| 亚洲精品久久久久久久久久久| 97人洗澡人人免费公开视频碰碰碰| 2019中文字幕在线| 黄色一区二区在线| 国产91精品黑色丝袜高跟鞋| 欧美亚洲国产日韩2020| 亚洲字幕在线观看| 亚洲欧美另类中文字幕| 国产精品草莓在线免费观看| 一区二区三区无码高清视频| 中文字幕欧美日韩在线| 日韩欧美国产高清91| 性色av一区二区咪爱| 精品视频在线播放色网色视频| 国产成人极品视频| 日韩精品免费综合视频在线播放| 九九热在线精品视频| 欧美黑人一级爽快片淫片高清| 国产福利视频一区二区| 国产亚洲精品久久久久久777| 久久精品成人欧美大片古装| 国产精品成人一区二区| 欧美在线视频免费观看| 一区二区日韩精品| 日韩hd视频在线观看| 欧美性xxxxx极品| 91精品国产乱码久久久久久蜜臀| 欧美激情欧美狂野欧美精品| 欧美日韩免费观看中文| 精品美女久久久久久免费| 一区二区福利视频| 日韩中文字幕网址| 亚洲免费一在线| 日韩专区在线播放| 欧美一区二区三区艳史| 国产精品成av人在线视午夜片| 在线播放精品一区二区三区| 日韩av三级在线观看| 91av在线免费观看| 久热精品在线视频| 国产在线久久久| 欧美激情中文字幕乱码免费| 国产精品永久在线| 久久九九亚洲综合| 欧美性猛交xxxx富婆弯腰| 欧美一级bbbbb性bbbb喷潮片| 日韩视频亚洲视频| 欧美激情视频在线观看| 亚洲图中文字幕| 精品视频一区在线视频| 久久久精品久久| 色婷婷av一区二区三区在线观看| 日韩电影中文字幕av| 国产精品爱久久久久久久| 亚洲aⅴ日韩av电影在线观看| 亚洲精品乱码久久久久久按摩观| 日韩欧美在线免费| 欧美日韩中国免费专区在线看| 欧美精品日韩www.p站| 国模精品一区二区三区色天香| 国产69精品久久久久9999| 伊人久久久久久久久久久久久| 自拍偷拍亚洲精品| 精品国产精品三级精品av网址| 成人高h视频在线| 亚洲aⅴ日韩av电影在线观看| 亚洲区在线播放| 5252色成人免费视频| 国产精品电影久久久久电影网| www高清在线视频日韩欧美| 欧美大人香蕉在线| 成年无码av片在线| 国产一区二区三区视频在线观看| 一区二区三区www| 亚洲国产精品va在线| 亚洲精品自产拍| 亚洲第五色综合网| 国产日韩欧美日韩| 久久久久久久电影一区| 国产成人在线播放| 日韩亚洲精品视频| 欧美日韩国产第一页| 久久久免费高清电视剧观看| 91久久精品国产91久久| 超碰精品一区二区三区乱码| 久久夜精品香蕉| 国产精品美女999| 欧美夫妻性生活视频| 国产一区二区三区免费视频| 国产欧美va欧美va香蕉在| 欧美黑人极品猛少妇色xxxxx| 国产精品av在线| 国产不卡一区二区在线播放| 国产精品9999| 久久免费视频网| 98视频在线噜噜噜国产| 亚洲一区二区自拍| 欧美亚洲第一页| 97视频免费在线看| 日韩久久午夜影院| 国产欧美一区二区三区久久人妖| 国产欧美精品va在线观看| 成人在线一区二区| 国产日韩欧美夫妻视频在线观看| 欧美日韩国产91| 在线播放国产一区中文字幕剧情欧美| 国产午夜精品麻豆| 国产精品男女猛烈高潮激情| 亚洲国产精久久久久久久| 精品色蜜蜜精品视频在线观看| 日韩精品久久久久久久玫瑰园| 国产男人精品视频| 欧美成年人视频网站| 欧美一级高清免费播放| 精品国产91乱高清在线观看| 久久91亚洲精品中文字幕| 伊人久久久久久久久久| 92国产精品久久久久首页| 一区二区亚洲精品国产| 亚洲免费人成在线视频观看| 欧美日韩亚洲激情| 日本久久精品视频| 久久精品视频在线| 欧美裸体xxxx极品少妇| 欧美在线观看视频|