Accès aux médias chargés comme s’il s’agissait de données

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Pour accéder aux données chargées, faites appel aux méthodes BitmapData.draw(), BitmapData.drawWithQuality() et SoundMixer.computeSpectrum(). Par défaut, il est impossible d’obtenir des données de pixels ou des données audio d’objets graphiques ou audio rendus ou lus par un fichier multimédia chargé dans un autre sandbox. Vous disposez toutefois des méthodes suivantes pour accorder un droit d’accès à ces données en franchissant les limites du sandbox :

  • Dans le contenu en cours de rendu ou lors de la lecture de données auxquelles vous voulez accéder, appelez la méthode Security.allowDomain() pour accorder un droit d’accès au contenu hébergé dans d’autres domaines.

  • Pour un fichier image, son ou vidéo chargé, ajoutez un fichier de régulation d’URL sur le serveur du fichier chargé. Ce fichier de régulation doit accorder l’accès au domaine du fichier SWF qui tente d’appeler la méthode BitmapData.draw(), BitmapData.drawWithQuality() ou SoundMixer.computeSpectrum() pour extraire des données de ce fichier. La méthode drawWithQuality est disponible dans Flash Player 11.3 et les versions ultérieures et dans AIR 3.3 et les versions ultérieures.

Les sections qui suivent offrent des détails sur l’accès aux données bitmap, son et vidéo.

Accès aux données bitmap

Les méthodes draw() et drawWithQuality() (Flash Player 11.3 et AIR 3.3) d’un objet BitmapData permettent d’extraire les pixels actuellement affichés de tout objet d’affichage vers l’objet BitmapData. Il peut s’agir des pixels d’un objet MovieClip, d’un objet Bitmap ou d’un objet d’affichage. Vous devez remplir les conditions suivantes pour que ces méthodes dessinent des pixels sur l’objet BitmapData :

  • Si l’objet source n’est pas un fichier bitmap chargé, l’objet source et (dans le cas d’un objet Sprite ou MovieClip) tous ses objets enfant doivent provenir du même domaine que l’objet appelant la méthode draw ou se trouver dans un fichier SWF qui est devenu accessible à l’objet appelant suite à l’appel de la méthode Security.allowDomain().

  • Si l’objet source est un fichier bitmap chargé, cet objet doit provenir du même domaine que l’objet appelant la méthode draw ou son serveur source doit inclure un fichier de régulation d’URL qui accorde l’autorisation nécessaire au domaine appelant.

Si ces conditions ne sont pas réunies, une exception SecurityError est renvoyée.

Lorsque vous appelez la méthode load() de la classe Loader, vous pouvez spécifier un paramètre context, qui constitue un objet LoaderContext. Si vous réglez la propriété checkPolicyFile de l’objet LoaderContext sur true, Flash Player recherche un fichier de régulation d’URL sur le serveur à partir duquel l’image est chargée. S’il existe un fichier de régulation autorisant le domaine du fichier SWF à l’origine du chargement, le fichier peut accéder aux données de l’objet Bitmap ; dans le cas contraire, l’accès est refusé.

Vous pouvez également spécifier une propriété checkPolicyFile dans une image chargée via la balise <img> d’un champ de texte. Pour plus d’informations, voir Chargement de fichiers SWF et d’images à l’aide de la balise <img> d’un champ de texte.

Accès aux données audio

Les API ActionScript 3.0 suivantes, liées aux sons, font l’objet de restrictions de sécurité :

  • Méthode SoundMixer.computeSpectrum() : toujours autorisée pour le code qui s’exécute dans le même sandbox de sécurité que le fichier audio. Des contrôles de sécurité sont nécessaires pour le code qui s’exécute dans d’autres sandbox.

  • Méthode SoundMixer.stopAll() : toujours autorisée pour le code qui s’exécute dans le même sandbox de sécurité que le fichier audio. Des contrôles de sécurité sont nécessaires pour les fichiers se trouvant dans d’autres sandbox.

  • Propriété id3 de l’objet Sound : toujours autorisée pour les fichiers SWF qui se trouvent dans le même sandbox de sécurité que le fichier son. Des contrôles de sécurité sont nécessaires pour le code qui s’exécute dans d’autres sandbox.

Chaque son est associé à deux types de sandbox, un sandbox de contexte et un sandbox de propriétaire :

  • Le domaine d’origine du son détermine le sandbox de contexte. Celui-ci établit si les données peuvent être extraites du son via la propriété id3 du son et la méthode SoundMixer.computeSpectrum().

  • L’objet qui déclenche la lecture du son détermine le sandbox de propriétaire, qui établit à son tour si le son peut être arrêté à l’aide de la méthode SoundMixer.stopAll().

Lorsque vous chargez le son à l’aide de la méthode load() de la classe Sound, vous pouvez spécifier un paramètre context, qui constitue un objet SoundLoaderContext. Si vous définissez la propriété checkPolicyFile de l’objet SoundLoaderContext sur true, le moteur d’exécution recherche un fichier de régulation d’URL sur le serveur à partir duquel est chargé l’audio. S’il existe un fichier de régulation autorisant le domaine du code à l’origine du chargement, le code peut accéder à la propriété id de l’objet Sound ; dans le cas contraire, l’accès est refusé. En outre, la propriété checkPolicyFile peut permettre d’activer la méthode SoundMixer.computeSpectrum() pour les sons chargés.

La méthode SoundMixer.areSoundsInaccessible() vous permet de savoir si l’appel à la méthode SoundMixer.stopAll() n’entraînerait pas l’arrêt de tous les sons parce que le sandbox de l’une ou de plusieurs des propriétés d’objet son est inaccessible à l’appelant.

La méthode SoundMixer.stopAll() permet d’arrêter tous les sons dont le sandbox de propriétaire est le même que celui de l’appelant de stopAll(). Elle arrête également les sons dont la lecture a été déclenchée par des fichiers SWF ayant appelé la méthode Security.allowDomain() pour autoriser le domaine du fichier SWF appelant la méthode stopAll(). Tous les autres sons ne sont pas arrêtés ; vous pouvez vérifier leur présence en appelant la méthode SoundMixer.areSoundsInaccessible().

L’appel de la méthode computeSpectrum() demande que chaque son en cours de lecture soit issu du même sandbox que l’objet appelant la méthode ou de la même source qui a autorisé l’accès au sandbox de l’appelant. Autrement, une exception SecurityError est renvoyée. Pour les sons chargés à partir de sons incorporés dans la bibliothèque d’un fichier SWF, l’autorisation est accordée en appelant la méthode Security.allowDomain() dans le fichier SWF chargé. Pour les données audio chargées à partir de sources autres que des fichiers SWF (issues de fichiers mp3 chargés ou de fichiers vidéo), un fichier de régulation d’URL hébergé sur le serveur source doit autoriser l’accès aux données figurant dans le fichier multimédia chargé.

Pour plus d’informations, voir Contrôles de création (développeur) et Contrôles de site Web (fichiers de régulation).

Pour accéder aux données audio à partir de flux RTMP, vous devez autoriser l’accès au serveur. La propriété ActionScript côté serveur Client.audioSampleAccess permet d’accéder à des répertoires spécifiques de Flash Media Server. Pour plus d’informations, voir le Guide de référence ActionScript de Flash Media Server côté serveur.

Accès aux données vidéo

La méthode BitmapData.draw() ou BitmapData.drawWithQuality() permet de capturer des données de pixels à partir de l’image active d’une vidéo. (La méthode drawWithQuality est disponible dans Flash Player 11.3 et les versions ultérieures et dans AIR 3.3 et les versions ultérieures.)

Il existe deux types de vidéo :

  • La vidéo diffusée en continu via RTMP à partir de Flash Media Server

  • La vidéo progressive, chargée à partir d’un fichier FLV ou F4V

Pour extraire les graphiques d’exécution de flux RTMP par le biais des méthodes draw, vous devez autoriser l’accès au serveur. La propriété ActionScript côté serveur Client.videoSampleAccess permet d’accéder à des répertoires spécifiques de Flash Media Server. Pour plus d’informations, voir le Guide de référence ActionScript de Flash Media Server côté serveur.

Lorsque vous appelez la méthode draw avec la vidéo progressive comme paramètre source, l’appelant de la méthode doit provenir du même sandbox que le fichier FLV ou le serveur du fichier FLV doit contenir un fichier de régulation qui autorise le domaine du fichier SWF appelant. Pour demander le téléchargement du fichier de régulation, définissez la propriété checkPolicyFile de l’objet NetStream sur true.