Forums Développement Multimédia

Aller au contenu

Capture vidéo de la scène

Défi Exportation vidéo NativeProcess CODE Actionscript

25 réponses à ce sujet

#1 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 20 February 2012 - 13:32 PM

Bonjour,

Je crois que je tiens un bon défi là :)

Objectif:

J'ai une animation générée dans une application AIR. Je voudrais transformer cette animation en vidéo et l'enregistrer sur ma machine.

- L'animation fait 1024x768 pixels.
- Je veux obtenir une vidéo en 50 fps.
- Je ne dispose pas d'assez de puissance pour me contenter de filmer l'écran avec un logiciel comme VLC ou CamStudio. Si je fais cela je rate des images. D'ailleurs AIR lui-même, sans parler de la capture vidéo, peine à tenir le FPS.
- J'ai donc codé un procédé qui me permet de jouer l'animation image par image, à la cadence que je veux, ou bien en attendant un évènement quelconque pour passer à l'image suivante.
- L'affichage de l'animation se fait avec Stage3D. Ce qui veut dire que je n'ai pas un accès facile au BitmapData contenant le rendu. Récupérer le contenu de la scène 3D dans un BitmapData est possible (Context3D.drawToBitmapData) mais couteux en temps, ce serait mieux d'éviter d'avoir à le faire.
- L'application n'est pas destinée à d'autre utilisateurs. C'est pour moi, je me sers de Flash comme d'un outil de réalisation, pour faire une animation que je veux diffuser en vidéo. Pas grave donc si la solution demande des bidouilles qu'on ne pourrait pas demander à un utilisateur lambda qui voudrait une application commode et tout-en-un.


Solution à améliorer:

Pour l'instant j'ai adopté la solution suivante: Affichage d'une image de l'animation, puis appel d'un petit programme de capture d'écran en png via NativeProcess. Dès que la capture est faite ça passe à l'image suivante, et etc. Quand j'ai tous les png (entre 20 000 et 30 000) j'en fais une vidéo avec ffmpeg.
Cette solution permet d'enregistrer environ 7 images par secondes. Du coup l'enregistrement de l'ensemble des images prend presque 1 heure, auquel s'ajoute le temps d'encodage à partir des images. J'aimerais bien pouvoir réduire ce temps.

[Edit du 03/11/2012] Une nouvelle solution

Comme je n'en pouvais plus de me retrouver avec des milliers de fichiers png, j'ai finalement réussi à faire autrement. Voir plus bas: http://forums.mediab...ost__p__1152306

Idées de comment faire, mais que je ne sais pas faire:

Voici les idée que j'ai eues, mais que je ne sais pas réaliser, et je me demande si quelqu'un saurait faire cela:

- Utiliser VLC pour capturer l'écran, en mode remote control, ce qui permet de lui envoyer des commandes, comme il le fait ici http://www.adobe.com...nrecording.html
Mais je n'ai pas trouvé la commande qui permet de dire à VLC: "capture une frame maintenant"

- Utiliser VLC ou ffmpeg, non plus en mode de capture d'écran, mais en lui fournissant les images via un autre protocole. Par exemple UDP, TCP/IP, rtp. Là je n'y connais rien, je n'ai jamais fait de trucs comme cela. Mais j'imagine que si c'est possible, il va falloir que j'envoie les images une par une via cette connexion, et que le logiciel les ajoutera une à une dans la vidéo, au fur et à mesure qu'il les reçoit.
Pour VLC: http://wiki.videolan..._network_stream
Pour ffmpeg: http://ffmpeg.org/ff....html#Protocols
Si quelqu'un sait faire cela il sera largement bienvenu :mrgreen: . Restera à voir si le temps que demande le drawToBitmapData de la scène 3D ne fais pas s'effondrer le gain de performance par rapport à ma méthode actuelle.

- Garder ma procédure de capture image par image en png, mais avec un programme qui tournerait en permanence. Pour l'instant je démarre l'utilitaire de capture à chaque screenshot. J'imagine que le temps de lancement du programme consomme du temps, et que ce serait mieux s'il tournait déjà en arrière-plan, et si je pouvais le commander en lui envoyant la commande "fait un screenshot maintenant". Je n'ai pas trouvé de tel utilitaire. Peut-être en modifier un existant, par exemple boxcutter dont les sources sont disponibles? Mais là encore je n'ai jamais programmé un truc comme ça.


Solutions écartées:

Voici d'autres idées que je n'ai pas retenues. Je les signale au cas où:

- Faire jouer l'animation au ralenti mais à cadence fixe, et filmer le tout avec VLC ou CamStudio. Cela serait simple, mais me demanderait plusieurs tests fastidieux pour trouver le meilleurs fps possible, où je vais être sûr de ne rater aucune image. En plus, cela ne serait adapté qu'à ce cas de figure, et je ne pourrai pas réutiliser ce procédé pour d'autre animations à venir qui serait plus grandes, plus petites, ou plus lourdes en calcul.

- Créer mon animation avec autre chose que flash. Haha très drôle, merci beaucoup, c'est sûr que Flash ne semble pas le plus adapté sur ce coup, mais c'est ce que je maitrise le mieux et au moins j'étais à peu près certains que j'arriverais à composer mon animation comme je la voulais.

- Utiliser la solution d'export vidéo de Flash Pro. Mais j'ai cru comprendre que ça ne marchait bien que si la machine était assez puissante pour faire tourner l'animation à la bonne cadence tout en encodant la vidéo, donc ce n'est pas pour moi. Et comme j'ai développé mon projet avec le SDK Flex, je ne peux tester facilement.

- Uiliser FLVEncoder. Mais les fichiers vidéos ne sont pas compressés je crois, donc cela ferait quelque chose d'énorme, peut-être même 1024*768*4*50*60*7 = 61Go pour une animation de 7 minutes à 50 fps.


Et voilà, je ne sais pas si quelqu'un m'aura lu jusqu'au bout! Des idées?

#2 Monz

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 3541 messages

Posté 20 February 2012 - 18:53 PM

Bonjour Lilive,

Je t'ai lu jusqu'au bout, et je peux et le dire : tu es un grand malade. :mrgreen:

Mais je vais regarder un peu ton truc, on ne sait jamais, si une idée me venait...

#3 Monz

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 3541 messages

Posté 20 February 2012 - 19:16 PM

Je ne sais pas si ça vaut le coup :

https://github.com/p...r/ScreenShooter
http://gotoandlearn....play.php?id=125

#4 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 20 February 2012 - 20:20 PM

Salut Monz,

Merci de t'être penché sur mon cas. Je suis allé voir l'extension sur github. Très intéressante, car elle permet de récupérer en actionscript les pixels de la capture.
Mais elle n'enregistre pas un fichier image sur le disque dur. Il faudrait donc que je le fasse en actionscript. Comme c'est déjà un peu ce que je fais, je ne crois pas assez que j'aurais un gain de performances pour le tenter. D'autant plus que la seule solution que je connais pour écrire une image sur le disque est PNGEncoder, qui doit prendre du temps. Ou alors je pourrais essayer de modifier le code c++ de l'extension pour qu'elle fasse la sauvegarde, mais je ne me le sens pas trop, pas assez à l'aise en c++.

Quand à coder moi-même un programme de screenshot, le seul intérêt que j'y verrais par rapport à celui que j'ai trouvé sur le net serait d'en faire un qui peut tourner en tache de fond et recevoir des commandes dans stdin pour lui signaler de faire une capture à un moment donné. Cela économiserait le temps de lancement et d'arrêt du processus à chaque capture. Et c'est un peu balèze pour moi, par rapport au temps que j'ai. Je ne développe pas en C# (cf le tuto de gotoAndLearn), et je débute à peine en C++. Disons que rien que le temps que je trouve comment importer et utiliser les bonnes bibiliothèques, et comment surveiller stdin, j'aurais surement déjà fait mon encodage plusieurs fois de la façon dont je m'y prend pour l'instant.

J'ai depuis mon premier message fait 2 découvertes:
- VLC peut tourner en arrière-plan et prendre des screenshots en recevant la commande "snapshot" via stdin. Super!
- Ceci ne marche pas sous windows. Moins super.


Autre découverte: On m'a susurré en coulisse de tester mon ordinateur pour tester le temps que ça prend de récupérer le contenu de la scène 3D dans un BitmapData. Ici: http://wonderfl.net/c/j27f
Chez moi il faut 150ms pour 1 drawToBitmapData. Donc ce n'est pas mieux que ma solution actuelle.
Même si j'arrivais à faire écouter VLC ou ffmpeg sur un port ou je ne sais quoi et à leur passer les images par ce biais, ces appels à drawToBitmapData me pourriraient les performances, donc adieu cette idée de solution.


Si je suis un grand malade, la guérison passera peut-être par d'autres biais que trouver la solution à mon problème, pour cette fois. Le lâcher-prise peut-être? :mrgreen:

#5 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7001 messages

Posté 20 February 2012 - 20:39 PM

Salut,

Et en passant par deux ordi ?
Un premier qui te lis ton animation et se sert de l'export vidéo (hardware PC) pour sortir.
Et un second qui récupère le signal et qui ne sert que d'encodeur ?

#6 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 21 February 2012 - 21:47 PM

Salut M.Spi :)

Hum je ne sais pas trop, disons que je joue la vidéo à 25fps plutôt que 50 (car le 1er ordi peine à tenir cette cadence), il faudrait que le second ordi puisse tenir ce rythme en encodage.
Mais je ne vois pas du tout comment on peut relier les 2 ordinateurs, qui seraient des portables, soit dit en passant. Il faut du matériel spécifique j'imagine?

#7 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7001 messages

Posté 21 February 2012 - 22:22 PM

Hello lilive,

Ha bah oui après c'est sur que ça dépend du matériel. :smile:

Pour l'encodage vidéo tu as plein de solutions, l'idéal c'est de se faire préter du matos, une caméra ou un magnéto pro du genre : http://www.visualsfr...dvcam-1662.html

Si tu veux en refaire souvent tu as aussi la solution encodeur externe : http://www.rueducomm...ns-aucun-PC.htm

Tu as aussi des solutions via le portable en Express Card : http://www.kelkoo.fr...deo+expresscard

Le tout est de sortir le signal proprement du PC pour le balancer sur un encodeur.
Après, tout dépend de tes besoins et des paramètres de ton anim (taille, fps,...), mais il doit également exister des solutions en Firewire, l'idéal pour ça serait d'avoir une petite caméra genre PD170 ou : http://www.pricemini...-Camescope.html

#8 Monz

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 3541 messages

Posté 22 February 2012 - 08:33 AM

Bonjour à tous les deux,

En tout cas, si tu bricoles un truc, ça m'intéressa d'avoir tes retours. Merci Monsieur Spi pour cette solution finalement évidente et certainement efficace : l'encodage par un outil prévu pour.

Je me demandais, un reflex numérique peut faire ce genre de chose ?

#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7001 messages

Posté 22 February 2012 - 10:18 AM

Coucou Monz,

Citation

Je me demandais, un reflex numérique peut faire ce genre de chose ?

Le 7D et le 5D doivent le faire normalement : http://www.amazon.fr...r/dp/B002NGNQZA

#10 Monz

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 3541 messages

Posté 22 February 2012 - 10:55 AM

Ah ah,
Je ne m'étais jamais penché là-dessus... Comme nous avons un 5D au boulot, je ferai un petit test...

#11 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 22 February 2012 - 12:10 PM

Quand le logiciel fait défaut, le matériel dédié vient à la rescousse! évidemment, encore fallait-il y penser, savoir que ça existe, et que c'est possible.
Merci pour toutes ces pistes M.Spi, c'est bien d'avoir ce point de vue.

Pour ce projet je ne pense pas qu'on va investir de l'argent sur du matériel, ni investir du temps pour faire fonctionner le-dit matériel, puisque je ne devrai faire l'encodage que quelques fois, donc je pourrais bien laisser l'ordinateur travailler pendant la pause déjeuner.

Au cas où ça profite à quelqu'un, voici comment j'ai fait:

var _filesDirectory:File;
var _screenShotApp:NativeProcess;
var _screenShotStartupInfo:NativeProcessStartupInfo;
var _screenShotArgs:Vector.<String>;
var _isWaitingForScreenShot:Boolean = false;
var _frame:int = 0;

// Répertoire "file" placé à côté du répertoire "build" dans lequel est l'application AIR
var appDirectory:File = new File(File.applicationDirectory.nativePath);
_filesDirectory = appDirectory.resolvePath("../files");

// Recherche du programme de screenshot
var appFile:File = _filesDirectory.resolvePath("programs/screenshot-cmd.exe");
if (!appFile.exists) throw new Error("Impossible de trouver screenshot-cmd.exe.");

// Recherche du répertoire d'enregistrement des images
var shotsDir:File = _filesDirectory.resolvePath("shots");
if (!shotsDir.exists) throw new Error("Impossible de trouver le dossier shots.");
if (!shotsDir.isDirectory) throw new Error("shots n'est pas un dossier.");

// Préparation des arguments à passer au programme
_screenShotArgs = new Vector.<String>(2, true);
_screenShotArgs[0] = "-o";
_screenShotArgs[1] = "";

// Information de lancement pour le programme
_screenShotStartupInfo = new NativeProcessStartupInfo();
_screenShotStartupInfo.executable = appFile;
_screenShotStartupInfo.workingDirectory = shotsDir;
_screenShotStartupInfo.arguments = _screenShotArgs;

// Création du processus
_screenShotApp = new NativeProcess();
_screenShotApp.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onScreenShotOutput);
_screenShotApp.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onScreenShotError);
_screenShotApp.addEventListener(NativeProcessExitEvent.EXIT, onScreenShotDone);


addEventListener(Event.ENTER_FRAME, onEnterFrame);

function onEnterFrame(e:Event):void {
        // Ne rien faire si la capture d'écran est en cours
        if (_isWaitingForScreenShot) return;
       
        // Affichage de l'image suivante
        monAnimation.gotoNextFrame();
        _frame ++;
       
        // Nom de fichier pour le screenshot
        var name:String = _frame.toString();
        while (name.length < 7) name = "0" + name;
        name = name + ".png";
        _screenShotArgs[1] = name;
        _screenShotStartupInfo.arguments = _screenShotArgs;

        // Lancer le screenshot
        if (_screenShotApp.running) throw new Error("Le programme de screenshot est encore en cours d'exécution.");
        _isWaitingForScreenShot = true;
        _screenShotApp.start(_screenShotStartupInfo);
}

// Affiche les messages de sortie du programme de screenshot
function onScreenShotOutput(evt:ProgressEvent):void{
        var outputData:String = _screenShotApp.standardOutput.readUTFBytes(_screenShotApp.standardOutput.bytesAvailable);
        trace(outputData);
}

// Affiche les messages d'erreur du programme de screenshot
function onScreenShotError(evt:ProgressEvent):void{
        var errorData:String = _screenShotApp.standardError.readUTFBytes(_screenShotApp.standardError.bytesAvailable);
        trace(errorData);
}

// Quand le programme de screenshot à terminé sa capture
function onScreenShotDone(e:NativeProcessExitEvent):void {
        if (e.exitCode != 0) throw new Error("Le programme de screenshot à renvoyé une erreur: " + e.exitCode);
        _isWaitingForScreenShot = false;
}

C'est fait en m'inspirant de http://www.adobe.com...nrecording.html , en utilisant le programme de capture d'écran http://code.google.c...screenshot-cmd/
Les captures se font sur tout l'écran.

#12 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 24 February 2012 - 10:54 AM

Bon, même si mon système fonctionne je continue un peu à fouiller.

Voir le messagelilive, le 20 February 2012 - 13:32 PM, dit :

Utiliser VLC ou ffmpeg, non plus en mode de capture d'écran, mais en lui fournissant les images via un autre protocole. Par exemple UDP, TCP/IP, rtp. Là je n'y connais rien, je n'ai jamais fait de trucs comme cela. Mais j'imagine que si c'est possible, il va falloir que j'envoie les images une par une via cette connexion, et que le logiciel les ajoutera une à une dans la vidéo, au fur et à mesure qu'il les reçoit.
Pour VLC: http://wiki.videolan..._network_stream
Pour ffmpeg: http://ffmpeg.org/ff....html#Protocols
Si quelqu'un sait faire cela il sera largement bienvenu :mrgreen: . Restera à voir si le temps que demande le drawToBitmapData de la scène 3D ne fais pas s'effondrer le gain de performance par rapport à ma méthode actuelle.
Grâce au second lien que m'a fourni Monz, je pourrais récupérer le ByteArray contenant les pixels de la scène, de façon peut-être plus rapide qu'avec un drawToBitmapData.

Maintenant je me dis qu'il doit bien y avoir un moyen d'envoyer cela à ffmpeg ou VLC, non?
Je suis un peu paumé quand même, mais quand je lis des choses comme...
http://help.adobe.co...gramSocket.html
http://sonnati.wordp...%80%93-part-iv/
... j'ai l'impression que ça doit être possible.
Faire que mon appli AIR envoie les données à ffmpeg via un protocole ou un autre.

Vraiment personne n'a d'expérience en la matière (ou au moins plus que moi, qui n'en ai aucune)?

#13 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7001 messages

Posté 24 February 2012 - 11:23 AM

Salut,

J'ai pas de réponse toute prête mais peut être quelques pistes à explorer :

http://www.bytearray.org/?p=26
http://www.bytearray.org/?p=90
http://forum.videola...hp?f=32&t=86533
http://www.flex-tuto...rray-png-async/

Et petit truc sympa que j'ai découvert mais qui ne te servira sans doute pas :

http://resolume.com/...l/index-fr.html

#14 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 24 February 2012 - 11:48 AM

Salut M.Spi,

Merci pour ta réponse. Mais à mon niveau en la matière, sans autres explications, je ne comprends pas ce qui pourrait m'aider. Pourquoi des liens vers des solutions d'encodage d'image statiques? Moi je veux justement confier l'encodage vidéo à un logiciel tiers.

#15 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7001 messages

Posté 24 February 2012 - 12:17 PM

Ben j'ai bien dit que j'avais pas de solution, juste des pistes au cas ou puisque tu n'as pas de réponse plus avancée ;-)

Ce que je ne comprend pas c'est pourquoi forcément passer par un encodeur vidéo tiers alors que des outils sont proposés dans Flash comme tu le dis plus haut. J'en reviens un peu à la solution que tu avais écarté :

Citation

- Utiliser la solution d'export vidéo de Flash Pro. Mais j'ai cru comprendre que ça ne marchait bien que si la machine était assez puissante pour faire tourner l'animation à la bonne cadence tout en encodant la vidéo, donc ce n'est pas pour moi. Et comme j'ai développé mon projet avec le SDK Flex, je ne peux tester facilement.

Je ne suis pas persuadé que tu soit obligé de lire l'animation pour l'encoder. Essayes quand même en faisant un export non compressé (si c'est possible), ce sera lourd mais tu évite la phase de compression, une fois que tu as la vidéo tu peux recompresser comme tu veux dans un autre soft. Ou alors, puisque tu peux faire tourner l'anim à une cadence plus faible, tu peux faire un export vidéo compressé directement depuis Flash puis accéler la vidéo à la bonne cadence ensuite via un soft comme VirtualDub par exemple.

Bref, je n'ai pas assez de connaissances pour t'avancer plus dans la voie que tu choisi, perso je serait passé par des solutions plus "clé en main".



EDIT : je viens de tenter un export d'une toute petite anim (pour test) en 1920*1024 à 50 fps en AVI trames non compressées sur un vieux AMD Sempron 1.3 Ghz monocore avec 1Go de Ram, l'export à pris 3 minutes pour 7 secondes et pèse 3 Go. Je repasse ensuite par Super ou VirtualDub pour refaire une compression propre. Maintenant ca dépend surement de ton anim.

#16 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 24 February 2012 - 13:12 PM

Voir le messageMonsieur Spi, le 24 February 2012 - 12:17 PM, dit :

Ben j'ai bien dit que j'avais pas de solution, juste des pistes au cas ou puisque tu n'as pas de réponse plus avancée ;-)
Et je t'en remercie encore. Je me demandais s'il y avait là-dedans des choses qui pourraient m'aider et que je n'aurais pas comprises.

Voir le messageMonsieur Spi, le 24 February 2012 - 12:17 PM, dit :

Je ne suis pas persuadé que tu soit obligé de lire l'animation pour l'encoder. Essayes quand même en faisant un export non compressé (si c'est possible), ce sera lourd mais tu évite la phase de compression, une fois que tu as la vidéo tu peux recompresser comme tu veux dans un autre soft. Ou alors, puisque tu peux faire tourner l'anim à une cadence plus faible, tu peux faire un export vidéo compressé directement depuis Flash puis accéler la vidéo à la bonne cadence ensuite via un soft comme VirtualDub par exemple.

Bref, je n'ai pas assez de connaissances pour t'avancer plus dans la voie que tu choisi, perso je serait passé par des solutions plus "clé en main".
Grand merci d'avoir pris le temps de faire ce test :Hola:
Sais-tu s'il faut faire en sorte que l'ordinateur soit assez puissant pour exécuter l'animation et l'encoder en assurant le bon fps, constant? Il me semble avoir vu cela dans de précédentes discussions. Comme ce ne sera pas mon cas, je devrai comme tu dis baisser le fps (ce que je peux faire sans problème).
Et pour tester il faudra aussi que je migre mon projet vers Flash CS5 (pour l'instant je compile avec amxmlc), ce que je n'ai jamais fait, et surement que je trouve la procédure pour permettre l'utilisation du FP11 avec Stage3D dans CS5. Donc du boulot, alors que je peux aussi bien jouer l'animation au ralenti et capturer mon écran avec VLC, CamStudio ou autre. Cela je peux le faire très simplement.
Il me semble que j'aurais un résultat similaire dans les 2 cas, avec l'inconvénient suivant: je devrais faire des essais pour trouver le meilleur fps possible, et ce fps ne sera adapté qu'à ce projet là. Comme ce n'est pas la première fois que je tombe sur ce problème d'encodage vidéo d'une animation, j'aimerais bien trouver une solution générique, qui me dispense de la phase "tests pour trouver le bon fps".

Je vois bien que je bataille dans l'idée de trouver un certain genre de solution, alors que j'ai d'autres possibles. Mais je continue à me dire qu'il doit y avoir plus adapté à mon cas, et au matériel dont je dispose.
Me suis-tu mon bon M.Spi :D ?

#17 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7001 messages

Posté 24 February 2012 - 13:30 PM

Citation

Grand merci d'avoir pris le temps de faire ce test :Hola:

Absolument pas de quoi, j'ai du temps aujourd'hui ;-)

Citation

Sais-tu s'il faut faire en sorte que l'ordinateur soit assez puissant pour exécuter l'animation et l'encoder en assurant le bon fps, constant?

Pour moi non, mais je ne saurais te garantir que ce n'est pas ce qui se passe en arrière boutique.
Lors de mon test il n'a pas cherché à lire l'animation, d'ailleurs il à mis 3 minutes pour encoder alors que mon anim dure 7 secondes donc à mon sens il n'y a pas de "lecture" en temps réel de l'anim et en tout cas il n'encode pas à la vitesse de lecture de l'anim.

Autre problème, dans mon anim de test je n'ai aucun code, il peut donc exporter "image par image", ce qui risque de ne pas être le cas avec une anim composée avec du code, dans ce cas il faudra passer par du MOV (qui accepte le code si je me rappelle bien).

Ta solution de capture écran au ralenti est pas mal en soit, sauf qu'elle t'oblige d'abord à lire ton anim (lourd pour le proc) puis de l'encoder via un logiciel tier (là encore lourd pour le proc). C'est pour ça que si tu arrivais à trouver une solution d'export directe, même en non compressé, ce serait le top, tant pis pour le poids, tu as surement assez de place pour faire tenir 7 minutes de vidéo en HD non compressée sur ton disque, pour 7 minutes tu devrais avoir besoin de 180 Go max et encore je ne suis pas sur de mon calcul.

Tu as testé des solutions comme :

http://www.commentca...video-converter
http://bytescout-swf...ut.softonic.fr/
http://www.01net.com...ches/36507.html

Ou encore mieux le logiciel SUPER qui semble convertir aussi le SWF en plus de plein d'autres formats :

http://www.erightsoft.com/SUPER.html

- Input Video format : 3gp/3g2, amv, asf, avi, dat, dvr-ms, flc, fli, flv, m2ts, mkv, mov, mpg, mtv, m4v, mp4, nsv, ogg, ogm, qt, ram, rm(vb), str, swf, tmf, trp, ts, ty(+), viv, vob, webm, wmv, wtv ..

#18 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 24 February 2012 - 14:48 PM

Je viens de faire un test vraiment simple avec SimpleFlvWriter ... qu'en penses tu ?


#19 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7001 messages

Posté 24 February 2012 - 17:08 PM

Tient le test de Goa viens de me donner une autre idée, as-tu tenté de lire simplement ton SWF et d'utiliser l'enregistrement écran de ce que tu lis via le forum ? Ca peut sans doute te solutionner facilement ton problème en te servant du serveur MB pour encoder ta vidéo, enfin c'est une idée comme ça....

#20 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 19 June 2012 - 21:31 PM

Désolé les gars, je viens de retrouver cette discussion et je m'aperçois que je n'avais pas répondu à vos derniers posts. C'est parce-que j'étais juste au niveau du temps et qu'il fallait que je boucle le projet, du coup j'en suis resté à ma solution de capture image par image via un logiciel tier, ce qui fonctionne, même s'il pourrait y avoir mieux.

#21 sebastien.portebois

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 3876 messages

Posté 19 June 2012 - 21:49 PM

Salut

Je profite que le post soit up, pour ajoute rune petite mise à jour, au cas où d'autres reviendraient dessus, qu'ils puissent en profiter

Voir le messagelilive, le 20 February 2012 - 20:20 PM, dit :

Mais elle n'enregistre pas un fichier image sur le disque dur. Il faudrait donc que je le fasse en actionscript. Comme c'est déjà un peu ce que je fais, je ne crois pas assez que j'aurais un gain de performances pour le tenter. D'autant plus que la seule solution que je connais pour écrire une image sur le disque est PNGEncoder, qui doit prendre du temps. Ou alors je pourrais essayer de modifier le code c++ de l'extension pour qu'elle fasse la sauvegarde, mais je ne me le sens pas trop, pas assez à l'aise en c++.

Depuis Air 3.3/Flash Player 11.3, on peut désormais directement exporter en jpg/png :
http://helpx.adobe.c...notes-11_3.html

http://help.adobe.co...a.html#encode()

Désolé d'arriver après tout le monde, mais comme le post était mis à jour, hopela!

#22 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 19 June 2012 - 23:09 PM

Bon à savoir pour la prochaine fois!
Merci :)

#23 Henri_B

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 337 messages

Posté 24 June 2012 - 08:47 AM

il faudrait surtout un volontaire pour un jour modifier la class d'export en flv et y inclure la compression (et le son...)... ça solutionnerait ce genre de probleme et me serait bien pratique... :-)

#24 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 03 November 2012 - 16:35 PM

Je reviens partager la solution que je viens d'élaborer, ça peut servir, même si je ne l'ai pas encore testée dans tous les sens.

Le principe est le suivant:
J'ai créé une application qui capture les images à l'intérieur d'une fenêtre et génére un fichier vidéo.
Cette application est commandée via STDIN, donc une application AIR peut la lancer comme NativeProcess et lui envoyer les commandes.
Cette application, programmée en C++, fonctionne uniquement sous windows. Je l'ai testée sous Windows 7.
Les sources et les binaires sont dans screencast-stdin-stdout.zip. J'ai utilisé Code::Blocks comme environnement de développement, GDI pour la capture des images, et la librairie Libav pour l'encodage vidéo.
Les vidéos sont encodées en RGB, sans perte de qualité. Les fichiers vidéos peuvent donc être assez gros. Le codec est FFV1, un codec lossless spécifique à Libav si j'ai bien compris. Pour compresser ou ré-encoder la vidéo par la suite, on peut donc utiliser ffmpeg.

Je joins également une classe AS qui permet de faire facilement la capture (fichier src.zip), ainsi que 2 exemples d'utilisation (Main1.as et Main2.as).
Il faut copier les fichiers du dossier bin/Release de screencast-stdin-stdout.zip dans un dossier programs/screencast, lui-même dans le dossier de l'application AIR.

J'ai commencé à m'en servir et ça marche. ça tourne dans les 10-15fps pour une animation de 1024x768, sur ma machine. Il est possible de réduire la fenêtre AIR pendant la capture, pour faire autre chose en attendant, ça ne gêne pas.

Je suis content: Je l'ai fait !!!!

N'hésitez pas à le dire si vous tentez de vous en servir ;)

Fichier(s) joint(s)



#25 Henri_B

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 337 messages

Posté 02 May 2013 - 15:18 PM

Je me permets de relancer cette discussion car mon problème est finalement très proche...

je dois, dans une appli flash ou air (pas décidé), etre capable de lire une video et de créer un deuxieme fichier video qui est un extrait du fichier lu (en connaissant le temps de départ et la durée).
a priori je sais le faire en lisant un .flv et en ecrivant un .flv (le format d'entree et de sortie devraient etre idealement les memes..) via la class flvwriter... mais il me semble qu'elle ne gere ni la compression ni le son... donc pas ok pour moi (surtout la compression).
idealement je prefererai pouvoir lire des .mov ou .mp4 (mon client préfère lui...) mais je ne sais pas ecrire ces formats... y a t-il une solution (meme payante) ?

attention ça doit fonctionner sous PC ET MAC, donc les solutions appelant des .exe externes ne conviennent pas...

peut etre via un fms ou équivalent ? ça peut exporter des .mov ?

HELP !

#26 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 02 May 2013 - 15:45 PM

Bonjour Henri,

Pour la lecture de .mov ou de .mp4 je ne sais pas.

Pour extraire un bout de vidéo, pourquoi pas ffmpeg, appelé depuis AIR ? Il doit y avoir moyen de détecter sous quel OS on est, et donc d'appeler le bon exécutable, en joignant au projet les versions de ffmpeg pour Windows et pour MacOS (vérifier que la licence le permet).

ffmpeg permet d'encoder dans beaucoup de formats. De plus, si la coupure se fait sur des images clés de la vidéo, ffmpeg pourra directement copier la partie concernée sans la réencoder, d'où une exécution rapide et aucune altération de la qualité.



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