Flash media server 3.5: dynamic streaming
Parmi les nouvelles fonctionnalités de Flash Media Server 3.5 se trouve le “Dynamic Streaming” ou “Diffusion dynamique en continu”. Derrière ce terme barbare se cache la faculté du serveur de distribuer la version d’une vidéo qui convient en fonction du débit réel dont on dispose, et cela en “temps réel”.
Mais qu’est ce que cela peut vraiment vouloir dire ? Un exemple vaut bien mieux que de long discours.
Imaginons que vous avez une vidéo encodée à 3Mbits/s. Sur une ligne ADSL 8Mbits/s, cela passera sans soucis. Si vous avez une ligne 1Mbits/s, ca va déjà être plus problématique, il faudra attendre que la vidéo soit téléchargée pour la voir, et le temps d’attente sera 3 fois plus long que le temps de visualisation. Mais me direz vous, il est tout à fait possible de le faire sans le Dynamic Streaming. Et bien oui.
Mais maintenant, imaginons que vous avec une ADSL 8Mbits/s, mais que quelqu’un dans votre réseau lance un gros téléchargement, et consomme 6 Mbits/s. Il ne vous restera que 2 Mbits/s (en théorie), ce qui sera insuffisant pour voir votre vidéo, et va provoquer l’affichage de jolis messages “Buffering”. C’est là que le Dynamic Streaming intervient. Vous aurez au préalable mis en place sur votre serveur une autre version de votre vidéo, mais encodée à 1,5 Mbits/s (en réduisant par exemple la résolution); le serveur ayant détecté que votre débit n’est pas suffisant vous basculera automatiquement sur la vidéo avec un plus faible débit. Dès que le téléchargement sera terminé et que vous retrouverez toute la bande passante disponible, la vidéo re-basculera sur la vidéo en haute qualité sans aucune coupure.
Cette fonctionnalité marquera t’elle la fin de ces atroces messages “Buffering” ??
Site de démo du dynamic streaming d’Adobe : www.streamflashhd.com
Informations sur le Flash media server 3.5 : www.adobe.com/fr/
Pseudo streaming h264 et flash
Vous connaissiez peut être déjà le module pour lighttpd qui se nomme “mod_flv_streaming” permettant de faire du pseudo streaming. Par pseudo streaming, on entend le fait de pouvoir naviguer dans la vidéo sans avoir fini son téléchargement.
Malheureusement, ce module ne permet que de lire des vidéos au format flv, et donc ne permet pas de profiter des vidéos au format mp4 du flash player 9/10.
Et bien l’équipe de CodeShop propose un module nommé “mod_h264_streaming” permettant de “streamer” du h264 via le serveur lighttpd, et donc directement dans notre cher flash player.
Pour obtenir une vidéo à partir de la seconde 30, il suffit de faire http://ip.du.serveur:port/fichier.mp4?start=30 . On obtient donc une bonne alternative au fms pour des sites qui n’ont pas besoin d’une sécurité au niveau du transfert de fichier, et souhaitent pouvoir mettre en place une ferme de diffusion sans devoir débourser une somme faramineuse (rappel : 1 licence fms / server).
Installation : http://h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Download
Configuration : http://h264.code-shop.com/trac/wiki/Mod-H264-Streaming
Exemples d’utilisation : http://h264.code-shop.com/trac/wiki/FlashPlayer
Zend Framework 1.7.0 / AMF support (Zend_Amf)
La version 1.7 du Zend Framework vient de sortir ! Rappelons que cette version introduit le composant Zend_Amf avec support du protocole AMF0 et AMF3.
Plus d’information sur Zend AMF :
Présentation de SOFA un ORM Air pour SQLite
Nous sommes en train de développer en interne un ORM SQLite pour Adobe AIR : SOFA. Nous avons décidé de le passer en open source prochainement. Il supporte le “nested fetching” , les delete et save en cascade , les formulas, les clefs composites, les relations one to one, one to many et many to many, l’héritage etc … Ce n’est pas une implémentation du pattern ActiveRecord : nous avons choisi de nous rapprocher plus d’un ORM comme hibernate qui même si il nécessite plus de configuration (bien plus) permet une plus grande souplesse dans de gros projets. Il n’y a pas de support pour les conventions pour l’instant mais pourquoi pas dans une prochaine release. Voilà un exemple de SofaQL :
Family family = sofaManager
.createQuery("load Family <=> f where f.id = :id; fetch Family.people")
.setIntegerArgument("id", 1)
.execute();
Donnera :
Handle load : load Family executing : select Family.ID as Family_0_id, Family.NAME as Family_0_name from FAMILY Family where Family.ID = 1 fetching : fetch Family.people executing : select Person.ID as Person_0_id, Person.NAME as Person_0_name, Person.ID as Person_0_id, Person.FAMILY_ID as Person_0_familyId from ( ( People Person inner join SuperPeople SuperPerson on SuperPerson.ID = Person.ID ) Person ) Person where Person.FAMILY_ID = 1
result =
(Family)#0
id = 1
name = "pezel"
people = (mx.collections::ArrayCollection)#1
filterFunction = (null)
length = 1
list = (mx.collections::ArrayList)#2
length = 1
source = (Array)#3
[0] (Person)#4
familyId = 1
id = 1
name = "arnaud"
uid = "A126F4E4-D083-68E2-0F34-723C76CA1A9C"
sort = (null)
source = (Array)#3
Ici Person est une sous class de SuperPerson. Le gros avantage comparé à un framework du type ActiveRecord c’est qu’il est possible de récupérer un objet et tous ses fils en une requête (et ceci récursivement). Dans le cas de listes cela peut s’avérer très pratique. De plus un support du batch fetching (récupération par groupe) est prévu dans la prochaine mise à jour.
Les save obéissent au même mécanisme, des cascade sont spécifiées par défaut mais peuvent être désactivées.
La dernière requête n’est pas très propre mais elle permet de supporter l’héritage à n-niveaux.
Tout ça devrait être disponible très prochainement sur google code. Stay tuned !
AMFPHP avance
Wade Arnold vient d’annoncer que le coeur d’amfphp allait être réécrit pour suivre celui de Zend_amf. Pour en savoir plus visitez son blog (en anglais) : http://wadearnold.com/blog/
FileReference.browse et Flash player 10
Peut être avez vous eu la désagréable surprise de recevoir des mails de clients pas contents car leur site plante dès qu’ils veulent envoyer un document. Or, vous n’avez rien touché au site entre temps, donc vous commencez à farfouiller dans le code, jusqu’à ne voir qu’une seule explication : c’est le flash player 10.
Et bien oui, Adobe a certainement renforcé la sécurité au niveau du browse pour rendre impossible l’appel de la fonction FileReference.browse() lors d’un appel traditionnel. C’est à dire que si vous appelez la fonction sur le click, ou tout autre intéraction de l’utilisateur (souris ou clavier), cela fonctionnera sans soucis. Par contre, si vous le faite depuis une fonction traditionnelle (par exemple après avoir enregistré votre objet), et bien cela vous enverra le joli message suivant :
Main Thread (Suspended: Error: Error #2176: Certaines actions, par exemple celles qui ouvrent une fenêtre contextuelle, ne peuvent être invoquées que par une interaction de l'utilisateur, telle qu'un clic de souris ou un appui sur une touche.) flash.net::FileReference/browse [no source] flexBugs/onCreationComplete flexBugs/___flexBugs_Application1_creationComplete flash.events::EventDispatcher/dispatchEventFunction [no source] flash.events::EventDispatcher/dispatchEvent [no source] mx.core::UIComponent/dispatchEvent mx.core::UIComponent/set initialized mx.managers::LayoutManager/doPhasedInstantiation
Nous n’avons pas encore trouvé de solution permettant de contourner le problème (si vous en avez une, n’hésitez pas à la poster dans les commentaires), mais cela va vous obliger à changer votre code, et ouvrir directement le browse sur une interaction utilisateur.
Flex CSS Advanced Selectors
Voici une bonne nouvelle pour les “styleurs” d’application Flex ! La nouvelle version offrira une bien meilleure gestion des styles !

Plus d’informations sur Flex et la nouvelle gestion des styles :
http://opensource.adobe.com/wiki/display/flexsdk/CSS+Advanced+Selectors
Pour tester la dernière release de Flex , rendez-vous sur :
http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4
Zend amf et mixed array
Pour ceux qui ont l’habitude d’utiliser AMFPHP Zend_amf, bien que très proche, pourrait être un peu troublant sur un point : les mixed array. Avec AMFPHP les objets de types mixed array sont sérialisés en tant qu’objet générique en flex (Object). Avec Zend_amf ce n’est plus le cas. Les objets de type array sont sérialisés sans transtypage et donc arrivent à flex en tant que tableau. Le problème c’est que ce type n’est pas très commode à utiliser en actionscript. Par exemple il est impossible d’utiliser le résultat brut dans un dataprovider et traverser la structure impose quelques lignes de code. Après avoir contacté Wade Arnold il semblerait que ce soit un comportement normal et qu’un cast soit possible avant l’envoi pour recevoir un objet de type Object. Voir son blog pour plus d’infos, il vient de poster un billet à ce sujet.


