Charger du son dynamiquement dans Flash

Tout comme pour les images bitmaps, vous pouvez charger dynamiquement des sons sauvegardés dans un format particulier, en l’occurence ici le MP3. Prenez donc soin de bien enregistrer vos sons dans ce format, qui est d’ailleurs de par ses caractéristiques le mieux adapté à une diffusion sur Internet (rapport qualité/poids notamment).

  1. ActionScript 1 et 2 – niveau débutant

  2. Ce qui va nous permettre de charger dynamiquement un son dans un SWF est la méthode loadSound(), qui est une méthode de l’objet Son.
    Avant de charger un son au format MP3, il faut d’abord créer une occurence (ou instance) de l’objet Son dans laquelle on chargera le fichier MP3, qui nous permettra de cibler celui-ci et donc de manipuler certaines de ses propriétés (volume, balance…).

    ?View Code ACTIONSCRIPT
    1
    2
    
    // Création d'un nouveau son appelé "monSon":
    monSon = new Sound();

    Une fois cet objet monSon créé, il nous faut encore lui assigner un son. Lorsque l’on souhaite jouer des sons importés dans flash, on utilise la méthode attachSound() qui permet de lui associer un son se trouvant dans la bibliothèque, auquel on avait pris soin au préalable de donner un identifiant de liaison. Pas vraiment dynamique tout ça :)
    Avec la méthode loadSound(), il n’est plus nécessaire d’importer le son dans le fichier FLA, de lui attribuer un identifiant de liaison, etc… Vous placez le fichier MP3 sur le serveur aux côtés du SWF, et ce dernier se chargera du reste… à condition toutefois que vous lui ayez demandé de le charger ;-) .

    ?View Code ACTIONSCRIPT
    1
    2
    3
    4
    
    // Création d'un nouveau son appelé "monSon"
    monSon = new Sound();
    // Chargement d'un fichier "musique.mp3" en flux continu dans monSon
    monSon.loadSound("musique.mp3",true);

    Une remarque sur le deuxième paramètre de cette méthode loadSound(). Il s’agit d’un booléen qui permet de préciser si on veut que le son se joue en flux continu (téléchargement progressif ou s’il s’agit d’un son d’évènement, auquel cas le paramètre sera mis à false et le son entièrement chargé avant de jouer.

  3. ActionScript 3 – niveau avancé

  4. Le chargement de son peut être réalisé de manière dynamique. Les fichiers audio résident à l’extérieur de l’animation et sont chargées dynamiquement. Deux techniques peuvent être employées : La première consiste à créer un objet URLRequest valide pointant vers le fichier MP3 et passer ce dernier au constructeur de la classe Sound :

    ?View Code ACTIONSCRIPT3
    1
    2
    3
    4
    5
    6
    7
    
    // création d'un objet Sound, la méthode load est automatiquement appelée
    var monSon:Sound = new Sound ( new URLRequest ("son.mp3") );
    /*
    Si la classe Sound détecte un objet URLRequest valide, le son est chargé automatiquement au sein du lecteur à l’aide de la méthode load.
    Le cas échéant, l’appel de la méthode load est obligatoire pour démarrer le chargement du son. La méthode load possède la signature suivante :
    */
    public function load(stream:URLRequest, context:SoundLoaderContext = null):void Voici le détail de

    chacun des paramètres :
    stream : un objet URLRequest pointant vers le fichier MP3 à charger.
    context : un objet SoundLoaderContext spécifiant la durée de préchargement en mémoire tampon ainsi que des consignes liées au chargement de fichiers de régulation.
    Attention, contrairement à l’intégration de son au sein de la bibliothèque compatible avec la plupart des formats audio, la méthode load de la classe Sound permet uniquement le chargement de fichiers MP3. Si nous tentons de charger un autre format de fichiers audio, aucune erreur spécifique n’est levée, le son n’est pas joué. La seconde technique consiste à créer l’objet Sound puis appeler manuellement la méthode load. Dans le code suivant nous ne passons pas d’objet URLRequest au constructeur de la classe Sound, le son est chargé à l’aide de la méthode load :

    ?View Code ACTIONSCRIPT3
    1
    2
    3
    4
    5
    
    // création d'un objet Sound
    var monSon:Sound = new Sound();
     
    // chargement dynamique du son
    son.load ( new URLRequest ("son.mp3") );

    Afin de gérer le chargement de son dynamique, l’objet Sound diffuse différents événements dont voici le détail :
    Event.COMPLETE : diffusé lorsque le chargement du son est terminé.
    Event.ID3: diffusé lorsque les informations ID3 sont disponibles.
    IOErrorEvent.IO_ERROR : diffusé lorsque le chargement du son échoue.
    Event.OPEN : diffusé lorsque le lecteur commence à charger le son.
    ProgressEvent.PROGRESS : diffusé lorsque le chargement est en cours. Celui-ci renseigne sur le nombre d’octets chargés et totaux.

    ?View Code ACTIONSCRIPT3
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    // instanciation d'un objet Sound
    var son:Sound = new Sound();
     
    // chargement dynamique du son
    son.load ( new URLRequest ("son.mp3") );
    // écoute des différents événements
     
    son.addEventListener( Event.OPEN, chargementDemarre );
    son.addEventListener( Event.ID3, informationsID3 );
    son.addEventListener( ProgressEvent.PROGRESS, chargementEnCours );
    son.addEventListener( Event.COMPLETE, chargementTermine );
    son.addEventListener( IOErrorEvent.IO_ERROR, erreurChargement );
     
    function chargementDemarre ( pEvt:Event ):void
    {
    trace("chargement démarré");
     
    }
     
    function informationsID3 ( pEvt:Event ):void
    {
    trace("informations ID3");
    }
     
    function chargementEnCours ( pEvt:ProgressEvent ):void
    {
    trace("chargement en cours : " + pEvt.bytesLoaded + " / " + pEvt.bytesTotal );
    }
     
    function chargementTermine ( pEvt:Event ):void
    {
    trace("chargement terminé");
    }
     
    function erreurChargement ( pEvt:IOErrorEvent ):void
    {
    trace("erreur de chargement");
    }

    Quelle que soit la technique employée pour charger dynamiquement un son, sa lecture doit être initiée à l’aide de la méthode play(). Si celle-ci est appelée en même temps que la méthode load(), la lecture du son est entamée lorsque suffisamment de données audio ont été téléchargées. Si nous tentons de démarrer la lecture du son avant l’avoir chargé, une erreur de type ArgumentError est levée : ArgumentError: Error #2068: Son non valide

    Attention, dans un contexte de chargement dynamique, la méthode load() ne renvoie pas d’objet SoundChannel. Seule la méthode play() le permet :

    ?View Code ACTIONSCRIPT3
    1
    2
    3
    4
    
    // instanciation d'un objet Sound, la méthode load est automatiquement appelée
    var son:Sound = new Sound ( new URLRequest ("son.mp3") );
    // lecture du son, la méthode play retourne un objet SoundChannel
    var canalSon:SoundChannel = son.play();

    Remarque ::
    Il est important de noter que le chargement dynamique de sons est régit par le modèle de sécurité du lecteur. Par défaut, le chargement et la lecture d’un fichier son provenant d’un domaine différent est autorisée, mais l’accès aux données du fichier son est régulée. Dans un contexte inter-domaine, l’utilisation de la propriété id3 de l’objet Sound, de la méthode computeSpectrum, de la classe SoundMixer ou de l’objet SoundTransform lève une erreur de type SecurityError. Il convient alors d’utiliser un fichier de régulation sur le domaine distant afin d’autoriser la manipulation du son. Rappelez-vous que le lecteur Flash ne charge pas automatiquement de fichier de régulation afin de limiter la bande passante utilisée.

6 réponses Souscrire aux commentaires


  1. geoffrey

    Bonjour, je débute en AS3, j’ai utilisé ce code :

    var son:Sound = new Sound ( new URLRequest (« son.mp3″) );
    var canalSon:SoundChannel = son.play();

    pour crée un son, maintenant, j’aimerais l’arreter. J’ai essayé :

    var canalSon:SoundChannel = son.stop();

    Mais on me retourne l’erreur :

    1061: Appel à la méthode stop peut-être non définie, via la référence de type static flash.media:Sound.

    19 jan 2011 @ 15:29


  2. maru

    Salut,

    pour arrêter le son, fait :

    canalSon.stop();

    19 jan 2011 @ 21:06


  3. geoffrey

    Merci de l’aide mais cette fois l’erreur est :
    1120: Accès à la propriété non définie canalSon.

    20 jan 2011 @ 12:22


  4. geoffrey

    De plus je précise que au final j’aimerais avoir 3 boutons qui ont 1 sont diffèrent chacun. Donc il faudrait que quand je clic sur le bouton1 le son 1 se lance, et les autre se coupe, si je clic sur le bouton 2 le son 2 se lance et les autres se coupent… et ainsi de suite.

    j’ai essayé des trucs genre :

    var canalSon1:SoundChannel = son1.play();
    var canalSon2:SoundChannel = son2.play();
    var canalSon3:SoundChannel = son3.play();

    je sais pas trop si on a le droit de faire ça, en tout cas j’ai toujours des erreurs de propriétés non définis.

    20 jan 2011 @ 12:23


  5. geoffrey

    Petite précision, lorsque je fais ça, pour lire les sons, aucun problèmes, ils se lisent tous les 3. Mon problème c’est pour les arrêter.

    canalSon.stop(); me donne l’erreur propriété non définie.
    canalSon:stop(); pas d’erreurs mais rien ne se passe.

    20 jan 2011 @ 12:50


  6. pierre

    merci pour ton tuto ça m’a bien aidé
    ++
    pierre

    27 déc 2011 @ 23:40

Répondre