Forums Développement Multimédia

Aller au contenu

swf ne s'affiche qu'à 100 % du chargement (preload ignoré)

CODE Ajax JQuery EaseJs

12 réponses à ce sujet

#1 lasco

    Ceinture Blanche

  • Members
  • Pip
  • 8 messages

Posté 05 February 2013 - 19:48 PM

Bonjour,

Euh… je ne suis pas forcément sûr qu'il faille poster cette question ici mais comme ça concerne aussi bien flash que javascript, je tente javascript.

Je vais essayer de faire une description la plus complète possible afin d'éviter que vous lecteurs perdiez votre temps à me poser des questions de base auxquelles j'aurais déjà pensé.
Désolé, de ce fait, pour la longueur du post…


Voilà : je tente de créer une gallerie de medias (jpg, swf et unity) indexées dans un xml et je bute sur un détail fâcheux, à savoir que mes fichiers .swf ne s'affichent qu'une fois chargés à 100 %, autrement dit le preload interne à ces swf n'est pas "reconnu". Et ça pose un énorme problème car certains pèsent 30 ou 50 Mo donc c'est évident que le blank pendant 40 secondes c'est pas jouable.

Bien sûr on me dira : c'est sûrement l'actionscript du preload qui foire. Sauf que non justement il ne foire pas. D'une part il fonctionne très bien dès lors que j'appelle ces fichiers dans un html autonome de ma gallerie (par exemple le html publié par Flash lui-même) et d'autre part, plus vicieux, cette "mise en cache" qui laisse le swf invisible pendant tout son chargement NE SE PRODUIT QUE SUR CERTAINES PLATE-FORMES.

A ce jour je constate le problème :
- sous Mac OS 10.6 (FF, Safari, Chrome)
- sous Windows (IE)

Mais il ne se produit pas :
- sous Mac OS 10.5.8 (FF, Safari)
- sous Linux (FF, Chrome)

J'ai vérifié la question de la version du lecteur flash mais elle ne semble pas en cause.
De toute façon les swf en question sont des fichiers très anciens en actionscript 1 donc toutes les versions du lecteur lisent ça sauf vraiment bécane du moyen-âge.

J'ai aussi essayé de contourner le problème en créant un fichier swf de preload qui appelle le swf de contenu mais ça ne change rien.

Du coup je me suis dit que ça devait venir d'un problème dans l'architecture du site qui est en jquery.

Je poste ci-dessous la fonction d'appel des swf, sachant qu'elle est incluse dans un .js plus vaste avec d'autres fonctions (d'appel de medias .jpg notamment) lui-même reliés à d'autres .js de gestion de menus, de mise en cache de données via ajax (genre titre d'images, id, etc).
Je poste donc cette fonction à tout hasard mais je ne pense pas que ça vienne de là, seulement comme je ne peux pas poster la totalité des codes de tout mon site (usine à gaz infernale) disons que ma question générale serait : y aurait-il, à votre connaissance, quelque chose qui ferait que certains navigateurs pourraient interpreter je ne sais quelle ligne js comme un ordre de forcément mettre en cache à 100 % un media avant de l'afficher et qui en quelque sorte passe par-dessus y-compris le comportement de base de tout swf qui est d'afficher sa première frame dès qu'elle est chargée ?

Bon voilà c'est la colle bien relou mais je n'ai trouvé aucune piste tangible sur le net (des tas de pb de preloads, oui, mais aucun qui correspondait au mien) et le simple mot clé "preload" ne renvoie pas un seul résultat dans la recherche sur mediabox.

A votre bon cœur siouplait…


function chargeSwf(swfFileName, callback){
        $("#div-media").height(540);
        $("#div-media").width(720);
        $("#div-media").html('<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '+
         'width="720" height="540" id="mymoviename" standby="Loading flash movie"> '+
        '<param name="movie" value="'+swfFileName+'" /> ' +
        '<param name="quality" value="high" /> '+
        '<param name="bgcolor" value="#000000" /> '+
        '<param name="play" value="true" />' +
        '<param name="loop" value="true" />' +
        '<param name="wmode" value="window" />' +
        '<param name="scale" value="showall" />' +
        '<param name="menu" value="true" />' +
        '<param name="devicefont" value="false" />' +
        '<param name="salign" value="" />' +
        '<param name="allowScriptAccess" value="sameDomain" />' +
        '<embed src="'+swfFileName+'" quality="high" bgcolor="#000000" '+
        'width="720" ' +
        'height="540" '+
        'play="true" '+
        'name="mymoviename" align="" type="application/x-shockwave-flash" '+
        'pluginspage="http://www.adobe.com/go/getflash"> '+
        '</embed> '+
        '</object> ') ;
         callback();
}
 


#2 eKimiya

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 423 messages

Posté 06 February 2013 - 09:33 AM

Salut !

Je n'ai jamais eu ton problème, mais pour intégrer tes .swf essaye plutôt de passer par swfobject : http://code.google.com/p/swfobject/
Pas certain que ça règle ton problème mais ça vaut le coup d'essayer ;-)

#3 lasco

    Ceinture Blanche

  • Members
  • Pip
  • 8 messages

Posté 06 February 2013 - 11:20 AM

ouaip merci du conseil, en fait j'y avais déjà pensé mais d'après la doc je voyais pas trop ce qu'apporte swfobject à part la sélection de la version du lecteur et l'appel d'expressinstall.swf au cas où…

bon mais tu as raison faut tout tenter quoiqu'il arrive, je vais essayer.

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 February 2013 - 16:12 PM

Salut,

Je n'ai pas vraiment la réponse au pourquoi de ce comportement, à part que ça doit encore être une spécificité à la c... des navigateurs cités....

Par contre tu dis :

Citation

je tente de créer une gallerie de medias (jpg, swf et unity) indexées dans un xml et je bute sur un détail fâcheux, à savoir que mes fichiers .swf ne s'affichent qu'une fois chargés à 100 %, autrement dit le preload interne à ces swf n'est pas "reconnu".

Pourquoi ne pas faire un préloader directement en Ajax pour tous tes médias (flash ou autre) au lieu d'insérer un préload par média ?

Un truc du genre : http://anychart.com/...ing/#sourceView

C'est une solution de contournement certes, mais ça permet au moins d'avoir un préloader unique quel que soit le média à charger et tu régle ton problème avec les fichiers swf. Pas de souci avec tes préloader internes, si je ne me trompe pas, puisque tes swf seront intégralement chargés en cache, les préload internes ne devraient donc même pas avoir le temps de s'afficher, mais c'est à vérifier.

#5 lasco

    Ceinture Blanche

  • Members
  • Pip
  • 8 messages

Posté 06 February 2013 - 16:41 PM

Je ne suis pas sûr de comprendre la suggestion.
Preloader tout le contenu du site est juste impensable, y en a pour 350 Mo. Même le faire uniquement pour les swf n'est pas jouable, ils représentent 140 Mo à eux-seuls.

Bon sinon j'ai testé l'appel via swfobject, ça change rien.

#6 lasco

    Ceinture Blanche

  • Members
  • Pip
  • 8 messages

Posté 06 February 2013 - 16:58 PM

Ce qu'il me faudrait serait un preload js / jquery mais avec getBytes pour afficher le pourcentage de chargement et pas seulement une petite roue genre ajax-loader.gif (ça, ça marche pour un chargement de 3 secondes mais pas de 30 ou 40…).

Or apparemment y a pas moyen de récuperer les bytes d'un swf en javascript malheureusement.
Sur le net, les quelques pages qui annoncent des trucs du genre "preload swf with jquery" sont en fait des sortes de "fake" puisqu'ils fournissent des codes js certes mais qui ne sont là que pour génèrer dynamiquement des mini-preloaders… swf. Qui eux évidemment savent aller chercher les bytes du swf principal qu'ils chargent eux-mêmes.

Donc le problème se reposera tout aussi bien avec ce genre de solution.

#7 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 February 2013 - 17:27 PM

Citation

Preloader tout le contenu du site

Ce n'est pas ce que je suggère, je recommande juste de faire un petit préloader que tu lance à chaque fois que tu appelle un média (swf, image, unity, ....) au lieu d'en avoir un à l'intérieur de chaque média (swf ou unity). Personne ne dit qu'il faut charger tout le contenu du site d'un coup ;-)

Par contre si en plus tu veux afficher la progression c'est autre chose.... (a voir au cas ou : https://developer.mo...toring_progress )

Maintenant, si ce n'est que pour charger des SWF, il te reste aussi l'option de faire un préloader en SWF directement qui va aller charger le contenu que tu veux comme un grand, il suffit de créer un préload générique et de lui passer le contenu que tu veux charger via une flashVar ( http://helpx.adobe.c...-flashvars.html ). Encore une fois si je ne me trompe pas.... ton préloader générique étant tout léger il va se charger tout de suite et s'afficher dans ta page, puis il va aller chercher le contenu à charger indépendamment du reste de la page.

#8 lasco

    Ceinture Blanche

  • Members
  • Pip
  • 8 messages

Posté 06 February 2013 - 17:56 PM

Voir le messageMonsieur Spi, le 06 February 2013 - 17:27 PM, dit :

Ce n'est pas ce que je suggère, je recommande juste de faire un petit préloader que tu lance à chaque fois que tu appelle un média (swf, image, unity, ....) au lieu d'en avoir un à l'intérieur de chaque média (swf ou unity). Personne ne dit qu'il faut charger tout le contenu du site d'un coup ;-)
ah mais ça j'ai déjà bien sûr.
Plus exactement j'ai qu'un seul preloadeur pour toutes mes images (jpeg) avec une petite roue .gif sauf que ce truc là fonctionne pas avec les swf.
Les fichiers unity c'est encore autre chose, ils embarquent une barre de preload que tu ne peux ni enlever ni changer ni rien donc au moins c'est clair :-)

Et en effet le véritable souci est celui de l'affichage de la progression pour les fichiers très lourds. Le loader pour un jpeg franchement je pourrais m'en passer c'est quasiment toujours instantané.

Pour l'instant l'option de preloader via un autre swf ne marche pas non plus mais faut que je regarde si je peux pas en inverser le sens.

merci pour ton lien en tout cas je vais me pencher dessus également (ou plutôt le filer à mon développeur par ce que moi j'y connais pas grand-chose à tout ça).

#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 February 2013 - 18:42 PM

Citation

Pour l'instant l'option de preloader via un autre swf ne marche pas non plus

Là ce n'est pas normal.
Un SWF tout léger ne devrait pas mettre trois plombes à s'afficher, ensuite que celui-ci charge un contenu (autre swf) ne dépend plus de la page et d'Ajax, c'est de la tambouille interne, donc soit ce sont tes SWF d'origine qui ont un problème (et tu ne le vois pas sur les autres navigateurs car ils sont en cache) soit il y a un souci mais qui ne vient pas du préloader.

#10 lasco

    Ceinture Blanche

  • Members
  • Pip
  • 8 messages

Posté 06 February 2013 - 19:36 PM

C'est pas qu'il met lui-même trois plombes à s'afficher (pour être sûr de ne pas confondre j'ai mis une petite image dans ce petit swf) mais que quand il charge le swf principal, le preloader ne marche pas.
A la limite c'est même pas un problème de "preload" c'est que le code html/javascript et/ou son interprétation par certaines versions de browsers refusent tout simplement d'afficher la première frame du swf "contenu" tant qu'il n'est pas chargé complètement.


Pour l'instant mon code de preload est dans le fichier principal (le contenu) par ce que c'était le plus rapide.
Je sais, on dit toujours que normalement faudrait mettre ce code de preload dans le "petit swf" mais à la limite ça ne change rien.
Là ce qui se passe :

- je charge en deux secondes mon "faux" preloader uniquement pour donner le change au code html/javascript et/ou au browser qui visiblement fait de la resistance. Ca, ça baigne, je vois la petite image de ce faux preloader qui arrive tout de suite (normal, y a rien d'autre dans ce fichier) et j'ai pris soin de la faire durer quelques dizaine de frames avant d'appeller le media principal, histoire d'être sûr de voir ce qui se passe.

- or dès qu'il arrive à la frame d'appel du swf principal, le preload interne est comme desactivé : ça reste "blank" jusqu'à ce qu'il soit complètement en cache et s'affiche.

J'entends bien la remarque qu'il y a sûrement un pb interne au code de preload - évidemment c'est la première chose que je regarde et j'aimerais ô combien que ça soit ça - sauf que là où c'est pas possible c'est que quand je tape directement l'url de mon swf (de l'un OU de l'autre) ben ça fonctionne parfaitement et pas du fait que ça serait "déjà en cache" puisque j'ai tout le temps de voir la barre de preload qui glisse douuuucement jusqu'à 100 %. Donc c'est bien que le code as / la bidouille interne des swf est correct.

Non mais c'est l'enfer ce truc. En 15 ans j'avais jamais vu un truc comme ça sauf que c'est comme par hasard la première fois que j'intègre mes swf à du "gros" code ajax/js etc. sur lesquels hélas je ne maîtrise pas grand chose.
Déjà 10 jours que je fouille partout sur le net pour piger ce qui se passe.

Merci quoiqu'il en soit pour ton interêt et tes conseils. Le combat continue :cool:

Je vais retenter le coup avec l'action de preload sur LE fichier d'appel et on verra.

#11 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 06 February 2013 - 19:44 PM

Citation

A la limite c'est même pas un problème de "preload" c'est que le code html/javascript et/ou son interprétation par certaines versions de browsers refusent tout simplement d'afficher la première frame du swf "contenu" tant qu'il n'est pas chargé complètement.

Désolé mais ce n'est pas possible (enfin, on est jamais sur de rien hein....), je m'explique :

Ton SWF est un objet intégré, en gros tu intègre le player dans une page HTML, c'est le seul lien réel qui existe entre ta page et ton SWF. Tout ce qui se passe dans le SWF est interne au player, donc ta page ne peut en aucun cas bloquer le chargement et encore moins agir sur les frames du SWF (sauf si tu lui indique expressément en passant par du javascript et du code externe et à mon avis ça ne se fait pas par hasard).

Techniquement c'est pareil que si tu intégrais une vidéo, ta page n'agit pas sur la vidéo, c'est le player qui le fait.

As-tu un exemple en ligne pour qu'on puisse tester, parce que là ton problème est vraiment cheulou.

#12 lasco

    Ceinture Blanche

  • Members
  • Pip
  • 8 messages

Posté 06 February 2013 - 20:21 PM

Voir le messageMonsieur Spi, le 06 February 2013 - 19:44 PM, dit :

Techniquement c'est pareil que si tu intégrais une vidéo, ta page n'agit pas sur la vidéo, c'est le player qui le fait.
Je sais.
D'ailleurs j'ai aussi quelques swf qui contiennent de la video (et rien d'autre) et appellent donc des .flv et y a absolument aucun problème avec ceux là. C'est du streaming donc pas besoin de preload.

En effet le problème est plus que louche.
D'ailleurs je viens d'essayer une version "inversée" du preload c'est-à-dire avec l'action de preload sur le "petit" fichier appellé en premier et une fois de plus :
> si je tape son adresse directement, impec : le preload se met en marche et la barre défile jusqu'au chargement complet du swf principal
> si je clique sur son lien dans mon interface html/js, le preload ne marche plus.


Mais oui je peux te poster la chose (je voulais pas faire pour pas alourdir le problème mais pourquoi pas)

Bon, j'ai viré les 3/4 des icones provisoirement le temps de régler ce problème mais faut quand même s'y retrouver donc :

Tu vas à cette adresse : http://www.chantierg...com/v3/julienV2

Et tu cliques sur cet icone :
Image IPB

normalement il est sur la ligne du dessous, c'est le septieme en partant de la droite.

Tu vois ce qui se passe ? En tout cas chez moi rien. Y a une barre mais qui défile pas.


Et ensuite tu vas ici :
http://www.chantiergraphique.com/v3/julienV2/medias/251.CELP_FLASH.swf
(oups, je vois que le truc s'affiche direct en "media" dans le message > je le mets en code)

C'est exactement ce fichier qui est appellé par ton premier clic…
Et comme tu devrais le constater, le preload marche parfaitement.


Donc c'est clair qu'il y a un problème qui ne tient pas qu'au preload flash lui-même.

#13 lasco

    Ceinture Blanche

  • Members
  • Pip
  • 8 messages

Posté 08 February 2013 - 09:26 AM

Tiens, mon dernier message a été zappé suite à une panne du serveur.

Bon ben je disais que j'ai trouvé la solution.
Fallait trouver le truc : en fait l'appel d'un swf dans un autre par son adresse relative ne marche pas à cause des dispositifs de sécurité contre les liaisons inter-swf. Il fallait mettre l'adresse ABSOLUE car appremment les navigateurs ne reconnaissent pas implicitement l'adresse relative (même dans le même répertoire) comme étant du même domaine.

merci à tous pour votre interêt et vos conseils en tout cas.



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

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