Forums Développement Multimédia

Aller au contenu

Animation en fonction du son

PAO Flash

6 réponses à ce sujet

#1 lizoune01

    Ceinture Blanche

  • Members
  • Pip
  • 3 messages

Posté 10 April 2011 - 22:02 PM

Bonjour à tous !

Je suis une petite débutante en AS3, je voudrais tenter de faire une petite animation flash, mais vu mon niveau pour l'instant je bloque un peu.
Je souhaiterai faire une animation du même type que ce dessin animé http://www.youtube.c...r&v=i58qcYzFHCs
Sauf que je voudrais que l'animation de ce dessin animé se fasse en fonction du son que le micro detecte ...En gros le principe c'est j'ecoute ce que dis le micro et en fonction de la hauteur du son (deciblel) je fais aller mon scenario à une image precise.

Mais je bloque un peu sur le code, si quelqu'un peut me donner quelques pistes ...

Merci à tous pour votre aide !

Modifié par lizoune01, 10 April 2011 - 22:02 PM.


#2 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 11 April 2011 - 22:58 PM

Bonjour, et bienvenue ici,

En Actionscript 3, pour connaitre l'intensité sonore dans le micro il faut d'abord récupérer le micro:
var micro:Microphone = Microphone.getMicrophone();
A partir de là tu peux avoir le niveau comme ceci:
var level:Number = micro.activityLevel;

Un exemple: j'ai une animation qui fait 100 images, et plus le volume est grand, plus je veux lire une image loin dans l'animation:

// "Attraper" le micro
var micro:Microphone = Microphone.getMicrophone();
micro.setLoopBack(true);

anim.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

function enterFrameHandler(e:Event):void {
        // Récupérer le niveau d'activité du micro
        var level:Number = micro.activityLevel;
        // Calculer une image à partir de ce niveau. Le * 2 est un exemple, ça dépend
        // du nombre d'image est de la sensibilité du micro
        var frame:int = level * 2 + 1;
        // Vérifier que l'image ne va pas au-delà de mon animation qui fait 100 images
        if (frame > 100) frame = 100;
        // Aller à l'image choisie
        anim.gotoAndStop(frame);
}

Tu en sauras plus en lisant l'aide de la classe Microphone

Pour m'y essayer moi-même, j'ai fait une petite application qui permet en plus de régler la sensibilité du micro et de faire revenir l'animation à 0 plus doucement (le fla est pour CS5):

Fichier(s) joint(s)



#3 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 11 April 2011 - 23:41 PM

Ouais ! \O/

C'est juste excellent ton truc ! Je ne m'y serais jamais essayée et c'est tout niais :Hola:

Du coup, dans l'enthousiasme j'ai hurlé un coup, ça a sévèrement perturbé le bastringue :mrgreen:
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#4 lizoune01

    Ceinture Blanche

  • Members
  • Pip
  • 3 messages

Posté 12 April 2011 - 13:22 PM

Voir le messagelilive, le 11 April 2011 - 22:58 PM, dit :


Pour m'y essayer moi-même, j'ai fait une petite application qui permet en plus de régler la sensibilité du micro et de faire revenir l'animation à 0 plus doucement (le fla est pour CS5):

Merci beaucoup !
Par contre j'ai la version CS4 de Flash donc je ne pourrai pas ouvrir le fichier, mais je vais tenter de tester tout ça !
Encore Merci.

Lisa

#5 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 12 April 2011 - 14:11 PM

Voir le messagelizoune01, le 12 April 2011 - 13:22 PM, dit :

Par contre j'ai la version CS4 de Flash donc je ne pourrai pas ouvrir le fichier, mais je vais tenter de tester tout ça !
J'ai essayé d'enregistrer pour CS4 mais ça me fait un bruit horrible...
Voici donc le code:

// "Attraper" le micro
var micro:Microphone = Microphone.getMicrophone();
micro.setLoopBack(true);

anim.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

slider.value = 5;

function enterFrameHandler(e:Event):void {
        // Récupérer le niveau d'activité du micro
        var level:Number = micro.activityLevel;
        // Calculer une image à partir de ce niveau (et de la sensibilité demandée)
        var frame:int = level * slider.value + 1;
        // Vérifier que l'image ne va pas au-delà de mon animation qui fait 100 images
        if (frame > 100) frame = 100;
        // Si la case est coché et que l'image est inférieure à l'image précédente...
        if (checkBox.selected && frame < anim.currentFrame) {
                // ... on s'assure de descendre d'une seule image seulement
                frame = anim.currentFrame - 1;
                if (frame < 1) frame = 1;
        }
        // Aller à l'image choisie
        anim.gotoAndStop(frame);
}
 
qui fonctionne donc avec un movieclip nommé anim, de 100 images, posé sur la scène. Il faut aussi un composant Slider nommé slider et un composant CheckBox nommé checkbox. Mais autant se passer de ces petits plus pour démarrer, c'est pour ça que j'avais surtout mis en avant mon premier code.

#6 lizoune01

    Ceinture Blanche

  • Members
  • Pip
  • 3 messages

Posté 12 April 2011 - 14:32 PM

Oui je viens de tester ça marche vraiment bien et ca ressemble pas mal à ce que je voulais faire (et en plus je comprends le code MIRACLE !).
Par contre, je suis peut-etre un peu débile ^^, mais j'ai un peu du mal à voir comment animer mon personnage. Je vois que tu as fait un clip avec une interpolation de forme sur 100 images.
Moi si je fais des captures d'écran de ma vidéos, que je retravaille sur photoshop et que j'en met 100 à la suite, ça fera se résultat ?

(Le fonctionnement de flash n'est pas encore très intuitif pour moi :oops: )

#7 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 12 April 2011 - 14:45 PM

Voir le messagelizoune01, le 12 April 2011 - 14:32 PM, dit :

Par contre, je suis peut-etre un peu débile ^^, mais j'ai un peu du mal à voir comment animer mon personnage. Je vois que tu as fait un clip avec une interpolation de forme sur 100 images.
Moi si je fais des captures d'écran de ma vidéos, que je retravaille sur photoshop et que j'en met 100 à la suite, ça fera se résultat ?
Ce code marchera avec n'importe quel clip qui fait 100 images, quelque soit la façon dont tu génères son contenu. Donc oui un clip qui contient 100 captures d'écran, pourquoi pas?

Tu as surement plusieurs façon de faire pour utiliser les images d'une vidéo existante.
- Tu peux importer une succession d'images dans un clip, comme tu dis, ce qui sera peut-être l'approche la plus simple
- Tu peux aussi transformer ta vidéo en un swf, charger ce swf dans ton animation, puis faire les gotoAndStop() sur ce swf chargé.
- Tu peux aussi essayer de charger la vidéo directement, et à la place des gotoAndPlay() faire des seek(), qui permettent de positionner une vidéo sur l'image que l'on veut. Si elle fonctionne cette dernière solution me semble bien, car tu auras surement la meilleure qualité d'image possible pour un poids de fichiers optimisé. Mais c'est peut-être aussi la plus compliquée.
Peut-être essaie déjà la première méthode qui te permettra d'avoir des résultats, et tu verras ensuite.



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP