Acceso a medios cargados como datos

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Para acceder a datos de carga, utilice los métodos BitmapData.draw() , BitmapData.drawWithQuality() y SoundMixer.computeSpectrum() . De forma predeterminada, no se pueden obtener datos de píxeles o datos de audio en objetos gráficos o de audio procesados o reproducidos por medios cargados en un entorno limitado diferente. No obstante, se pueden utilizar los métodos siguientes para otorgar permiso para acceder a dichos datos en los límites del entorno limitado:

  • En el contenido que procesa o reproduce los datos a los que se va a acceder, llame al método Security.allowDomain() para permitir el acceso a los datos al contenido del resto de dominios.

  • En una imagen, sonido o vídeo cargado, añada un archivo de política URL en el servidor del archivo cargado. Este archivo de política debe conceder acceso al dominio del archivo SWF que intenta llamar a los métodos BitmapData.draw() , BitmapData.drawWithQuality() o SoundMixer.computeSpectrum() para extraer datos del archivo. El método drawWithQuality está disponible en Flash Player 11.3 y versiones posteriores; AIR 3.3 y versiones posteriores.

En las siguientes secciones se proporcionan detalles sobre el acceso a datos de mapa de bits, sonido y vídeo.

Acceso a datos de mapa de bits

Los métodos draw() y drawWithQuality() (Flash Player 11.3; AIR 3.3) de un objeto BitmapData permiten dibujar en el objeto BitmapData los píxeles de cualquier objeto de visualización que se están mostrando. Podrían ser los píxeles de un objeto MovieClip, un objeto Bitmap o cualquier objeto de visualización. Se deben cumplir las siguientes condiciones para que estos métodos dibujen píxeles en el objeto BitmapData:

  • En el caso de un objeto de origen que no sea un mapa de bits cargado, el objeto de origen y (en el caso de un objeto Sprite o MovieClip) todos sus objetos secundarios deben proceder del mismo dominio que el objeto que realiza la llamada al método draw(), o bien deben incluirse en un archivo SWF que sea accesible para el llamador mediante una llamada al método Security.allowDomain() .

  • En el caso de un objeto de origen de mapa de bits cargado, el objeto de origen debe proceder del mismo dominio que el objeto que realiza la llamada al método draw() o su servidor de origen debe incluir un archivo de política URL que conceda permiso al dominio que realiza la llamada.

Si no se cumplen estas condiciones, se emite una excepción SecurityError.

Cuando se carga una imagen mediante el método load() de la clase Loader, se puede especificar un parámetro context , que es un objeto LoaderContext. Si se establece la propiedad checkPolicyFile del objeto LoaderContext en true , Flash Player comprueba si hay un archivo de política entre dominios en el servidor desde el cual se carga la imagen. Si hay un archivo de política y este admite el dominio del archivo SWF que realiza la carga, el archivo podrá acceder a los datos del objeto Bitmap; en caso contrario, se denegará el acceso.

También se puede especificar una propiedad checkPolicyFile en una imagen cargada a través de una etiqueta <img> en un campo de texto. Para obtener información más detallada, consulte Carga de archivos SWF e imágenes mediante la etiqueta <img> de un campo de texto .

Acceso a datos de sonido

Las siguientes API de ActionScript 3.0 relacionadas con el sonido tienen restricciones de seguridad:

  • El método SoundMixer.computeSpectrum() : siempre se permite en el código que se ejecuta en el mismo entorno limitado de seguridad que el archivo de sonido. Para el código de otros entornos limitados existen comprobaciones de seguridad.

  • El método SoundMixer.stopAll() : siempre se permite en el código que se ejecuta en el mismo entorno limitado de seguridad que el archivo de sonido. Para los archivos de otros entornos limitados existen comprobaciones de seguridad.

  • La propiedad id3 de la clase Sound: siempre se permite en archivos SWF que se encuentran en el mismo entorno limitado de seguridad que el archivo de sonido. Para el código de otros entornos limitados existen comprobaciones de seguridad.

Cada sonido tiene dos tipos de entornos limitados asociados, que son un entorno limitado de contenido y un entorno limitado de propietario:

  • El dominio de origen del sonido determina el entorno limitado de contenido que, a su vez, determina si los datos pueden extraerse del sonido a través de la propiedad id3 del sonido y a través del método SoundMixer.computeSpectrum() .

  • El objeto que inició el sonido que se reproduce determina el entorno limitado de propietario que, a su vez, determina si el sonido puede detenerse a través del método SoundMixer.stopAll() .

Cuando se carga el sonido mediante el método load() de la clase Sound, se puede especificar un parámetro context , que es un objeto SoundLoaderContext. Si establece la propiedad checkPolicyFile del objeto SoundLoaderContext como true , el motor de ejecución comprobará la existencia de un archivo de política URL en el servidor desde el que se carga el sonido. Si hay un archivo de política y este admite el dominio del código que realiza la carga, el código podrá acceder a la propiedad id del objeto Sound; en caso contrario, no será posible. Además, si se establece un valor de la propiedad checkPolicyFile , se puede activar el método SoundMixer.computeSpectrum() para sonidos cargados.

Se puede utilizar el método SoundMixer.areSoundsInaccessible() para saber si una llamada al método SoundMixer.stopAll() no va a detener todos los sonidos porque el que realiza la llamada no puede acceder al entorno limitado de uno o varios propietarios de sonidos.

Llamar al método SoundMixer.stopAll() permite detener estos sonidos cuyo entorno limitado de propietario es el mismo que el que realiza la llamada a stopAll() . También detiene los sonidos que han empezado a reproducirse porque unos archivos SWF realizaron una llamada al método Security.allowDomain() para permitir el acceso por parte del dominio del archivo SWF que realiza la llamada al método stopAll() . Los demás sonidos no se detienen y su presencia puede revelarse mediante una llamada al método SoundMixer.areSoundsInaccessible() .

Para llamar al método computeSpectrum() , es necesario que cada sonido que se esté reproduciendo se encuentre en el mismo entorno limitado que el objeto que realiza la llamada al método o que proceda de un origen que haya concedido permiso al entorno limitado del que realiza la llamada; en caso contrario, se emite una excepción SecurityError. En el caso de los sonidos cargados desde sonidos incorporados en una biblioteca de un archivo SWF, el permiso se concede a través de una llamada al método Security.allowDomain() en el archivo SWF cargado. En el caso de los sonidos que no proceden de archivos SWF (procedentes de archivos MP3 cargados o archivos de vídeo) un archivo de política URL en el servidor de origen concede acceso a los datos de los medios cargados.

Para obtener más información, consulte Controles de autor (desarrollador) y Controles de sitio web (archivos de política) .

Para acceder a datos de sonido desde flujos RTMP, debe permitir el acceso en el servidor. Utilice la propiedad Client.audioSampleAccess de ActionScript de servidor para permitir acceso a directorios específicos de Flash Media Server. Para obtener más información, consulte la referencia del lenguaje ActionScript de Flash Media Server .

Acceso a datos de vídeo

Se puede utilizar el método BitmapData.draw() o BitmapData.drawWithQuality() para capturar los datos de píxeles del fotograma actual de un vídeo. (El método drawWithQuality está disponible en Flash Player 11.3 y versiones posteriores; AIR 3.3 y versiones posteriores.)

Hay dos tipos distintos de vídeo:

  • Transmisión de vídeo en RTMP desde Flash Media Server

  • Vídeo progresivo, que se carga desde un archivo FLV o F4V

Para utilizar los métodos de dibujo y extraer gráficos de flujos RTMP en tiempo de ejecución, debe permitir el acceso en el servidor. Utilice la propiedad Client.videoSampleAccess de ActionScript de servidor para permitir el acceso a directorios específicos de Flash Media Server. Para obtener más información, consulte la referencia del lenguaje ActionScript de Flash Media Server .

Cuando se llama al método de dibujo con vídeo progresivo como valor del parámetro source , quien realiza la llamada al método debe encontrarse en el mismo entorno limitado que el archivo FLV, o el servidor del archivo FLV debe tener un archivo de política que conceda permiso al dominio del archivo SWF que realiza la llamada. Para solicitar la descarga del archivo de política, debe establecerse la propiedad checkPolicyFile del objeto NetStream en true .