套件 | flash.media |
類別 | public final class SoundMixer |
繼承 | SoundMixer Object |
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
sampleData
事件之 Sound 物件而產生的聲音)。
屬性 | 定義自 | ||
---|---|---|---|
audioPlaybackMode : String [靜態]
指定所有 Sound 物件的音訊播放模式。 | SoundMixer | ||
bufferTime : int [靜態]
開始串流之前,將內嵌串流聲音預先載入緩衝區的秒數。 | SoundMixer | ||
constructor : Object
類別物件的參照或是特定物件實體的建構函數。 | Object | ||
soundTransform : flash.media:SoundTransform [靜態]
可控制全域聲音屬性的 SoundTransform 物件。 | SoundMixer | ||
useSpeakerphoneForVoice : Boolean [靜態]
在裝置處於語音模式時切換免持聽筒。 | SoundMixer |
方法 | 定義自 | ||
---|---|---|---|
[靜態]
會判斷是否有任何聲音因為安全性限制而無法存取。 | SoundMixer | ||
[靜態]
會拍攝目前聲波的快照,然後將它放置於指定的 ByteArray 物件中。 | SoundMixer | ||
指出物件是否有已定義的指定屬性。 | Object | ||
指出 Object 類別的實體是否位於指定為參數的物件原型鏈中。 | Object | ||
指出指定的屬性是否存在,以及是否可列舉。 | Object | ||
為迴圈作業設定動態屬性的可用性。 | Object | ||
[靜態]
會停止目前正在播放的所有聲音。 | SoundMixer | ||
傳回代表此物件的字串,根據地區特定慣例進行格式化。 | Object | ||
會傳回指定之物件的字串形式。 | Object | ||
會傳回指定之物件的基本值。 | Object |
audioPlaybackMode | 屬性 |
audioPlaybackMode:String
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 3 |
指定所有 Sound 物件的音訊播放模式。在行動裝置上,這個屬性會根據平台用語來設定聲音屬性和預設值。在桌上型電腦和電視環境中,音訊播放模式並無功能上的差異。
這個屬性的有效值定義於 AudioPlaybackMode 類別中。
注意:在 iOS 上,如果一個應用程式設定 audioPlaybackMode=AudioPlaybackMode.VOICE
,其他應用程式便無法將它變更為 AudioPlaybackMode.MEDIA
。
盡量減少使用 AudioPlaybackMode.VOICE
模式,並在語音呼叫結束時儘快嘗試切換為 AudioPlaybackMode.MEDIA
模式,以允許其他應用程式以媒體模式播放。
當您在 iOS 上變更音訊播放模式時,原生應用程式會短暫暫停播放音樂。
預設值為 AudioPlaybackMode.MEDIA。
實作
public static function get audioPlaybackMode():String
public static function set audioPlaybackMode(value:String):void
擲回值
ArgumentError — kInvalidParameterError
|
相關 API 元素
bufferTime | 屬性 |
bufferTime:int
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
開始串流之前,將內嵌串流聲音預先載入緩衝區的秒數。 除非您實作跨網域原則檔,否則已載入聲音中的資料 (包括其緩衝時間) 無法由不同網域中的 SWF 檔存取。如需安全性和聲音的詳細資訊,請參閱 Sound 類別的說明。除非您實作跨網域原則檔,否則已載入聲音中的資料 (包括其緩衝時間) 無法由不同網域中檔案的程式碼存取。但在 AIR 應用程式的應用程式安全執行程序中,程式碼可以存取來自任何來源的聲音檔中的資料。如需安全性和聲音的詳細資訊,請參閱 Sound 類別的說明。
SoundMixer.bufferTime
屬性只會影響 SWF 中內嵌串流聲音的緩衝時間,與以動態方式建立的 Sound 物件 (亦即,在 ActionScript 中建立的 Sound 物件) 無關。 SoundMixer.bufferTime
的值無法覆寫或設定預設緩衝時間 (在傳遞至 Sound.load()
方法的 SoundLoaderContext 物件中指定)。
實作
public static function get bufferTime():int
public static function set bufferTime(value:int):void
相關 API 元素
soundTransform | 屬性 |
soundTransform:flash.media:SoundTransform
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
可控制全域聲音屬性的 SoundTransform 物件。 SoundTransform 物件包含可用來設定音量、左右相位、指定左邊喇叭,以及指定右邊喇叭的屬性。 此屬性中所使用的 SoundTransform 物件會提供最終聲音設定,而這些設定會在套用任何個別聲音設定後,套用至所有聲音。
實作
public static function get soundTransform():flash.media:SoundTransform
public static function set soundTransform(value:flash.media:SoundTransform):void
相關 API 元素
useSpeakerphoneForVoice | 屬性 |
useSpeakerphoneForVoice:Boolean
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 3 |
在裝置處於語音模式時切換免持聽筒。當 SoundMixer.audioPlaybackMode
設定為 AudioPlaybackMode.VOICE
時,智慧型手機依預設會使用電話耳機做為音訊輸入。useSpeakerphoneForVoice
屬性可讓您覆寫預設輸出,以便在手機應用程式中實作免持聽筒按鈕。這個屬性在 AudioPlaybackMode.VOICE
以外的模式中不會發揮作用。在桌上型電腦和電視環境中,這個屬性沒有作用。
注意:在 iOS 上,如果您的應用程式已經設定 audioPlaybackMode=VOICE
,並且另一個應用程式也在語音模式中播放,便無法設定 useSpeakerphoneForVoice=true
。
注意:在 Android,您必須在 AIR 應用程式描述器設定 android.permission.MODIFY_AUDIO_SETTINGS
,否則變更此值不會產生作用。此外,此設定是全域裝置設定。裝置上執行的其他應用程式則可以隨時變更基礎裝置設定。
預設值為 false。
實作
public static function get useSpeakerphoneForVoice():Boolean
public static function set useSpeakerphoneForVoice(value:Boolean):void
相關 API 元素
areSoundsInaccessible | () | 方法 |
public static function areSoundsInaccessible():Boolean
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9 |
會判斷是否有任何聲音因為安全性限制而無法存取。 例如,如果聲音的載入來源網域與呼叫這個方法之內容所在的網域不同,並且此聲音的伺服器沒有 URL 原則檔案 (可授與該網域的網域存取權限),則無法存取此聲音。雖然仍可載入並播放此聲音,但您無法在不可存取的聲音上執行低階作業,例如取得聲音的 ID3 中繼資料。
針對應用程式安全執行程序中的 AIR 應用程式內容,呼叫這個方法一定會傳回 false
。應用程式安全執行程序中的內容可存取所有聲音,包括從其它網域載入的聲音。
Boolean — Boolean 的字串形式。
|
相關 API 元素
computeSpectrum | () | 方法 |
public static function computeSpectrum(outputArray:ByteArray, FFTMode:Boolean = false, stretchFactor:int = 0):void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9 |
會拍攝目前聲波的快照,然後將它放置於指定的 ByteArray 物件中。 這些值會格式化成一般化的浮點值 (範圍介於 -1.0 到 1.0 之間),並且傳遞給 outputArray
參數的 ByteArray 物件會覆寫成這些新的值。 所建立的 ByteArray 物件大小會固定為 512 個浮點值,其中前 256 個值表示左聲道,而後 256 個值則表示右聲道。
注意:這個方法會受限於本機檔案安全性和跨網域載入的限制。如果要使用本機檔案或不是從呼叫內容網域伺服器載入的聲音,您可能需要透過跨網域原則檔來處理安全執行程序限制。如需詳細資訊,請參閱 Sound 類別的說明。 此外,這個方法無法用來從 RTMP 串流擷取資料,即使它是由與 RTMP 伺服器位於相同網域的內容呼叫也一樣。
Flash Player 9.0.115.0 和更新版本以及 Adobe AIR 透過 RTMP 支援此方法。您可以使用伺服器端指令碼控制 Flash Media Server 上串流的存取。如需詳細資訊,請參閱「Adobe Flash Media Server 伺服器端 ActionScript 語言參考」中的 Client.audioSampleAccess
和 Client.videoSampleAccess
屬性。
參數
outputArray:ByteArray — ByteArray 物件,其中會存放與聲音相關聯的值。 如果任何聲音由於安全性限制 (areSoundsInaccessible == true ) 而無法使用,outputArray 物件就會維持不變。 如果停止所有聲音,就會以零來填滿 outputArray 物件。
| |
FFTMode:Boolean (default = false ) — Boolean 值,指出是否會先在聲音資料上執行傅利葉轉換。 將此參數設定為 true 會導致方法傳回頻譜,而非原始聲波。 在頻譜中,低頻是在左邊表示,而高頻是在右邊表示。
| |
stretchFactor:int (default = 0 ) — 聲音樣本的解析度。 如果您將 stretchFactor 值設定為 0,就會在 44.1 KHz 取樣資料。如果此值設定為 1,就會在 22.05 KHz 取樣資料。如果此值設定為 2,就會在 11.025 KHz 取樣資料,依此類推。
|
相關 API 元素
flash.utils.ByteArray
flash.media.Sound
flash.media.SoundLoaderContext.checkPolicyFile
範例 ( 如何使用本範例 )
computeSpectrum()
方法產生聲波資料的圖形格式。
建構函式中會載入聲音檔案,並設定為開始播放 (這個範例沒有錯誤處理功能,而且假設該聲音檔案與 SWF 檔在相同目錄中)。 這個範例會在聲音播放時偵聽 Event.ENTER_FRAME
事件,一再重複觸發 onEnterFrame()
方法,以繪製聲音資料值的圖形。 當聲音播放完畢時,onPlaybackComplete()
方法會移除 Event.ENTER_FRAME
事件的偵聽程式,以停止繪圖程序。
在 onEnterFrame()
方法中,computeSpectrum()
方法會將原始聲音儲存在 bytes
位元組陣列物件中。 資料會以 44.1 KHz 的頻率取樣。 包含 512 個位元組資料的位元組陣列,其中每個各包含一個介於 -1 和 1 之間的浮點值。 前 256 個值代表左聲道,後 256 個值代表右聲道。 第一個 for 迴圈會讀取前 256 個資料值 (左立體聲道),並使用 Graphics.lineTo()
方法從每個點繪製線條到下一個點 (聲音波形的向量圖像顯示會直接寫入類別的 Sprite 物件)。 聲音位元組是以 32 位元浮點數的形式從位元組串流中讀取,而且會乘上圖形高度,以產生圖形的垂直範圍。 寬度設定為聲道長度的兩倍寬度。 第二個 for 迴圈會讀取下一組 256 個值 (右立體聲道),並以相反的順序繪製線條。 g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);
和 g.lineTo(0, PLOT_HEIGHT);
方法會繪製波形的基線。 所產生的波形圖會呈現鏡像的效果。
package { import flash.display.Sprite; import flash.display.Graphics; import flash.events.Event; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.net.URLRequest; import flash.utils.ByteArray; import flash.text.TextField; public class SoundMixer_computeSpectrumExample extends Sprite { public function SoundMixer_computeSpectrumExample() { var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("Song1.mp3"); snd.load(req); var channel:SoundChannel; channel = snd.play(); addEventListener(Event.ENTER_FRAME, onEnterFrame); channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); } private function onEnterFrame(event:Event):void { var bytes:ByteArray = new ByteArray(); const PLOT_HEIGHT:int = 200; const CHANNEL_LENGTH:int = 256; SoundMixer.computeSpectrum(bytes, false, 0); var g:Graphics = this.graphics; g.clear(); g.lineStyle(0, 0x6600CC); g.beginFill(0x6600CC); g.moveTo(0, PLOT_HEIGHT); var n:Number = 0; for (var i:int = 0; i < CHANNEL_LENGTH; i++) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); g.endFill(); g.lineStyle(0, 0xCC0066); g.beginFill(0xCC0066, 0.5); g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); for (i = CHANNEL_LENGTH; i > 0; i--) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(0, PLOT_HEIGHT); g.endFill(); } private function onPlaybackComplete(event:Event):void { removeEventListener(Event.ENTER_FRAME, onEnterFrame); } } }
stopAll | () | 方法 |
public static function stopAll():void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
會停止目前正在播放的所有聲音。
>在 Flash Professional 中,這個方法不會停止播放磁頭。設定為串流的聲音會隨著播放磁頭移到它們所位於的影格時繼續播放。
使用此屬性時,必須考慮下列安全性模型:
- 根據預設,呼叫
SoundMixer.stopAll()
方法只會停止與呼叫此方法之物件位於相同安全執行程序中的聲音。 播放作業與呼叫之物件不是從相同安全執行程序開始的任何聲音則不會停止。 - 當您使用 Sound 類別的
load()
方法載入聲音時,可以指定context
參數 (SoundLoaderContext 物件)。 如果您將 SoundLoaderContext 物件的checkPolicyFile
屬性設定為true
,Flash Player 或 Adobe AIR 就會檢查載入聲音的伺服器是否有跨網域原則檔案。如果伺服器具有跨網域原則檔案,而且此檔案允許呼叫內容的網域,則該檔案就可以使用SoundMixer.stopAll()
方法來停止載入的聲音,否則就無法停止聲音。
但在 Adobe AIR 中,application
安全執行程序中的內容 (使用 AIR 應用程式所安裝的內容) 沒有這些安全性限制。
如需安全性詳細資訊,請參閱「Flash Player 開發人員中心」主題:安全性。
範例 ( 如何使用本範例 )
stopAll()
方法,將兩個同時播放的聲音設為靜音。
建構函式中會載入兩個不同的聲音檔案,並設定為開始播放。 第一個聲音於本機載入,並指定給聲道 (假設該檔案與 SWF 檔在相同目錄中)。 第二個檔案會從 Adobe 網站載入並進行串流處理。 為了能夠使用 SoundMixer.stopAll()
方法,所有聲音都必須可供存取 (可使用 SoundLoaderContext 物件檢查跨網域原則檔案)。 每個聲音都有事件偵聽程式,會在載入聲音檔案期間發生 IO 錯誤時叫用。 此外,還會建立 muteButton
文字欄位。 它會偵聽按一下滑鼠事件,進而叫用 muteButtonClickHandler()
方法。
在 muteButtonClickHandler()
方法中,如果文字欄位內容是 "MUTE",areSoundsInaccessible()
方法會檢查混音器能否存取該檔案。 如果可以存取該檔案,stopAll()
方法就會停止聲音。 如果再次選取文字欄位,第一個聲音又會開始播放,而且文字欄位的內容會變回 "MUTE"。這一次,stopAll()
方法會將執行中的聲音設定靜音。 請注意,聲道 stop()
方法也可用來停止指定給該聲道的特定聲音 (若要使用聲道功能,每次叫用 play()
方法時都必須將聲音重新指定給聲道)。
package { import flash.display.Sprite; import flash.net.URLRequest; import flash.media.Sound; import flash.media.SoundLoaderContext; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.events.MouseEvent; import flash.events.IOErrorEvent; public class SoundMixer_stopAllExample extends Sprite { private var firstSound:Sound = new Sound(); private var secondSound:Sound = new Sound(); private var muteButton:TextField = new TextField(); private var channel1:SoundChannel = new SoundChannel(); public function SoundMixer_stopAllExample() { firstSound.load(new URLRequest("mySound.mp3")); secondSound.load(new URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3")); firstSound.addEventListener(IOErrorEvent.IO_ERROR, firstSoundErrorHandler); secondSound.addEventListener(IOErrorEvent.IO_ERROR, secondSoundErrorHandler); channel1 = firstSound.play(); secondSound.play(); muteButton.autoSize = TextFieldAutoSize.LEFT; muteButton.border = true; muteButton.background = true; muteButton.text = "MUTE"; muteButton.addEventListener(MouseEvent.CLICK, muteButtonClickHandler); this.addChild(muteButton); } private function muteButtonClickHandler(event:MouseEvent):void { if(muteButton.text == "MUTE") { if(SoundMixer.areSoundsInaccessible() == false) { SoundMixer.stopAll(); muteButton.text = "click to play only one of sound."; } else { muteButton.text = "The sounds are not accessible."; } } else { firstSound.play(); muteButton.text = "MUTE"; } } private function firstSoundErrorHandler(errorEvent:IOErrorEvent):void { trace(errorEvent.text); } private function secondSoundErrorHandler(errorEvent:IOErrorEvent):void { trace(errorEvent.text); } } }
Tue Jun 12 2018, 03:47 PM Z