將載入的媒體當做資料加以存取

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

若要存取載入資料,請使用 BitmapData.draw() BitmapData.drawWithQuality() SoundMixer.computeSpectrum() 方法。透過不同安全執行程序載入的媒體所呈現或播放的圖形或音效物件,預設您無法從中取得像素資料或音效資料。不過,您可以使用下列方法,授與跨安全執行程序界限存取這類資料的權限:

  • 在呈現或播放要存取資料的內容中,呼叫 Security.allowDomain() 方法,將資料存取權限授與其他網域中的內容。

  • 對於載入的影像、聲音或視訊,請在載入的檔案之伺服器上加入 URL 原則檔。這個原則檔必須將權限授與 SWF 檔案的網域,此 SWF 檔案會嘗試呼叫 BitmapData.draw() BitmapData.drawWithQuality() SoundMixer.computeSpectrum() 方法,以便從檔案擷取資料。 drawWithQuality 方法可以在 Flash Player 11.3 及更新版本,以及 AIR 3.3 及更新版本中取得。

下列各節會提供有關存取點陣圖、聲音和視訊資料的詳細資訊。

存取點陣圖資料

BitmapData 物件的 draw() drawWithQuality() (Flash Player 11.3、AIR 3.3) 方法可以讓您將任何顯示物件的目前顯示像素繪製至 BitmapData 物件。這可以包括 MovieClip 物件、Bitmap 物件或任何顯示物件的像素。這些方法若要繪製像素至 BitmapData 物件,必須符合下列條件:

  • 在來源物件不是載入的點陣圖之情況下,來源物件及其 (若是 Sprite 或 MovieClip 物件) 所有子物件都必須與呼叫 draw 方法的物件來自相同網域,或者必須在呼叫 Security.allowDomain() 方法以後呼叫者可存取的 SWF 檔案中。

  • 在 Loaded 點陣圖來源物件的情況下,來源物件必須與呼叫 draw 方法的物件來自相同的網域,或者其來源伺服器必須包含 URL 原則檔,其中授與呼叫網域存取權限。

如果不符合這些條件,就會擲回 SecurityError 例外。

當您使用 Loader 類別的 load() 方法載入影像時,可以指定 context 參數 (LoaderContext 物件)。如果您將 LoaderContext 物件的 checkPolicyFile 屬性設定為 true ,Flash Player 就會檢查載入聲音的來源伺服器是否有 URL 原則檔。如果有原則檔,而且此檔案授與載入 SWF 檔所在網域的權限,則該檔案就可以存取 Bitmap 物件中的資料,否則就會拒絕存取。

您也可以在經由文字欄位之 <img> 標籤載入的影像中,指定 checkPolicyFile 屬性。如需詳細資訊,請參閱 使用文字欄位中的 <img> 標籤載入 SWF 檔和影像

存取聲音資料

下列與聲音相關的 ActionScript 3.0 API 有安全性限制:

  • SoundMixer.computeSpectrum() 方法:永遠允許與聲音檔位於相同安全執行程序中執行的程式碼。若為其他安全執行程序中執行的程式碼,就會進行安全性檢查。

  • SoundMixer.stopAll() 方法:永遠允許與聲音檔位於相同安全執行程序中執行的程式碼。若為其它安全執行程序中的檔案,就會進行安全性檢查。

  • 聲音類別的 id3 屬性:永遠都允許與聲音檔位於相同安全執行程序中的 SWF 檔存取。若為其他安全執行程序中執行的程式碼,就會進行安全性檢查。

每一個聲音檔都有兩種相關聯的安全執行程序,也就是內容安全執行程序和擁有者安全執行程序:

  • 聲音的原始網域會決定內容安全執行程序,而且這會決定是否可經由聲音的 id3 屬性和 SoundMixer.computeSpectrum() 方法,從聲音中摘取資料。

  • 開始播放聲音的物件則決定擁有者安全執行程序,而這會決定是否可以使用 SoundMixer.stopAll() 方法停止聲音播放。

當您使用 Sound 類別的 load() 方法載入聲音時,可以指定 context 參數 (SoundLoaderContext 物件)。如果您將 SoundLoaderContext 物件的 checkPolicyFile 屬性設為 true ,執行階段就會檢查載入聲音的來源伺服器是否有 URL 原則檔。如果具有原則檔,而且檔案允許載入程式碼的網域,則該檔案就可以存取 Sound 物件的 id 屬性,否則就無法存取。此外,設定 checkPolicyFile 屬性也可以為載入的聲音啟用 SoundMixer.computeSpectrum() 方法。

您可以使用 SoundMixer.areSoundsInaccessible() 方法,查出呼叫 SoundMixer.stopAll() 方法是否會停止所有聲音,因為呼叫者無法存取一個或多個聲音擁有者。

呼叫 SoundMixer.stopAll() 方法會停止擁有者與 stopAll() 的呼叫者位於相同安全執行程序中的聲音;也會停止由 (已呼叫 Security.allowDomain() 方法,允許由呼叫 stopAll() 方法的 SWF 檔網域存取之) SWF 檔開始播放的聲音。任何其它聲音都不會停止,只要呼叫 SoundMixer.areSoundsInaccessible() 方法就能顯示這些聲音的存在。

呼叫 computeSpectrum() 方法需要播放的每一個聲音都與呼叫該方法的物件之安全執行程序相同,或是其來源已允許呼叫者的安全執行程序存取,否則就會擲回 SecurityError 例外。若聲音是從內嵌於 SWF 檔中元件庫之聲音載入,則會在被載入端 SWF 檔中呼叫 Security.allowDomain() 方法授與權限。若是從 SWF 檔以外來源載入聲音 (源自載入的 MP3 檔或從視訊檔),在來源伺服器上的 URL 原則檔便會授與權限,以存取所載入之媒體中的資料。

如需詳細資訊,請參閱 作者 (開發人員) 控制 網站控制 (原則檔)

若要從 RTMP 串流存取聲音資料,您必須允許伺服器上的存取權限。使用伺服器端 ActionScript Client.audioSampleAccess 屬性,允許存取 Flash Media Server 上的特定目錄。如需詳細資訊,請參閱 伺服器端 ActionScript 語言參考

存取視訊資料

您可以使用 BitmapData.draw() BitmapData.drawWithQuality() 方法,擷取目前視訊影格中的像素資料 ( drawWithQuality 方法可以在 Flash Player 11.3 及更新版本,以及 AIR 3.3 及更新版本中取得)。

總共有兩種不同的視訊:

  • 來自 Flash Media Server 且透過 RTMP 串流的視訊

  • 從 FLV 或 F4V 檔案載入的漸進式視訊

若要使用 draw 方法從 RTMP 串流擷取執行階段圖形,您必須允許伺服器上的存取權限。使用伺服器端 ActionScript Client.videoSampleAccess 屬性,允許存取 Flash Media Server 上的特定目錄。如需詳細資訊,請參閱 伺服器端 ActionScript 語言參考

當您以漸進式視訊做為 source 參數呼叫 draw 方法時,方法的呼叫者必須與 FLV 檔案位於相同的安全執行程序,或是 FLV 檔案的伺服器必須具有授與呼叫 SWF 檔案之網域存取權限的原則檔。您可以將 NetStream 物件的 checkPolicyFile 屬性設定為 true ,要求下載原則檔。