作为数据访问加载的媒体

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

要访问加载数据,请使用 BitmapData.draw()SoundMixer.computeSpectrum() 方法。默认情况下,您无法从其他沙箱中加载的媒体呈现或播放的图形或音频对象中获取像素数据或音频数据。但是,您可以使用下列方法授予跨沙箱边界访问此类数据的权限:

  • 在呈现或播放要访问的数据的内容中,调用 Security.allowDomain() 方法以授予对其他域中的内容的数据访问权限。

  • 对于加载的图像、声音或视频,在被加载文件所在的服务器上添加 URL 策略文件。此策略文件必须向试图调用 BitmapData.draw()SoundMixer.computeSpectrum() 方法的 SWF 文件所在的域授予访问权限,以便从文件提取数据。

以下各节提供有关访问位图、声音和视频数据的详细信息。

访问位图数据

借助 BitmapData 对象的 draw() 方法,可以将任何显示对象的当前显示像素绘制到 BitmapData 对象。这样能够包括 MovieClip 对象、Bitmap 对象或任何显示对象的像素。要使用 draw() 方法将像素绘制到 BitmapData 对象,必须满足以下条件:

  • 如果是除所加载位图之外的源对象,则该源对象及其(如果是 Sprite 或 MovieClip 对象)所有子对象必须与调用 draw() 方法的对象位于同一域,或者它们必须位于调用方通过调用 Security.allowDomain() 方法可访问的 SWF 文件中。

  • 如果是已加载的位图源对象,则该源对象必须与调用 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() 方法 — 对于与声音文件在同一安全沙箱中运行的代码,始终允许使用此方法。对于其他沙箱中的文件,则需经过安全检查。

  • Sound 类的 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() 方法的 SWF 文件来启动播放的声音,以允许调用 stopAll() 方法的 SWF 文件所在的域进行访问。任何其他声音均不会停止,可以通过调用 SoundMixer.areSoundsInaccessible() 方法来确定此类声音是否存在。

调用 computeSpectrum() 方法要求播放的每个声音应与调用该方法的对象位于同一沙箱中,或者位于已向调用方的沙箱授予权限的源;否则会引发 SecurityError 异常。对于从 SWF 文件库中嵌入声音加载的声音,通过在加载的 SWF 文件中调用 Security.allowDomain() 方法授予权限。对于从非 SWF 文件的源(源自加载的 mp3 文件或视频文件)中加载的声音,源服务器上的 URL 策略文件将授予访问所加载媒体中数据的权限。

有关详细信息,请参阅作者(开发人员)控制网站控制(策略文件)

要从 RTMP 流访问声音数据,必须拥有对服务器的访问权限。使用服务器端 ActionScript Client.audioSampleAccess 属性允许访问 Flash Media Server 上的特定目录。有关详细信息,请参阅 Server-Side ActionScript Language Reference

访问视频数据

可以使用 BitmapData.draw() 方法捕获视频当前帧中的像素数据。

视频有两种不同形式:

  • 从 Flash Media Server 通过 RTMP 流式传输的视频

  • 从 FLV 或 F4V 文件加载的渐进式视频

要使用 BitmapData.draw() 方法从 RTMP 流提取运行时图形,必须拥有对服务器的访问权限。使用服务器端 ActionScript Client.videoSampleAccess 属性允许访问 Flash Media Server 上的特定目录。有关详细信息,请参阅 Server-Side ActionScript Language Reference

当调用 BitmapData.draw() 方法,并且 source 参数为渐进式视频时,BitmapData.draw() 的调用方必须与 FLV 文件位于同一沙箱,或者 FLV 文件所在的服务器上必须存在一个策略文件,用以向执行调用的 SWF 文件所在的域授予访问权限。通过将 NetStream 对象的 checkPolicyFile 属性设置为 true,可以请求下载该策略文件。