Lab : FCS, FMS2, FMIS3 : problèmes de saccades sur les flvs sans bande son

Contexte du problème

Setup de previews pour un webTV (diffusion continue de videos)

Je devais faire un service de previews des programmes en cours pour une webTV. La webTV n'offrant pas de live mais seulement une playlist de programmes enregistrés, j'ai décidé de réencoder des échantillons des émissions au format de mes vignettes et sans bande son.

Cette façon de faire me permettra de

  • Gagner en bande passante car pas de son et image plus petite;
  • Limiter la charge sur le serveur de webTV (les previews des programmes étant visibles par tous sur une page web publique ça va me permettre de placer les previews sur un autre serveur afin de garantir une stabilité au service payant de la webTV);
  • Séparer physiquement les previews des versions complètes - données moins importantes pouvant être ainsi différenciées dans la politique de stockage et d'archivage.

Mise en place du service

Donc je parse mon dossier de previews avec l'objet File, je crée une liste que je stocke dans un SharedObject (SO) et j'intancie mon stream et crée la "queue" (file d'attente) ce qui donne un truc du genre :

    application.onAppStart = function(){
	debug("Starting LiveTV with "+application.server);
	//Pour jouer les streams à partir de l'interface admin et lire le contenu du SO
	application.allowDebug=true;
	//Dossier contenant les videos
	vp	= '/videoclips/';
	//Création du stream live "tv"
	ns	= Stream.get('tv');
	//Parsing du dossier et récupération de la playlist
	pl	= new Playlist(vp);
	list    = pl.available_streams;
	//Création de la file d'attente de diffusion & début de la diffusion
	for(var offset in list){
		track	=	vp+list[offset];
		sl	   =	Math.floor(Stream.length(track));
		debug("Adding "+track+" > duration : "+sl);
		ns.play(track, 0,sl,false);
	}
	...
    
Ce script sans surprise fonctionne à merveille avec mes videos de tests (clips musicaux, bandes annonces de films,...).

Le problème

Ce script fonctionnant chez moi, je décidai d'en développer un semblable pour mon client et là problème : toutes les vidéos saccades. J'ai tout de suite pensé à un problème de configuration du Flash Media Server qui serait différente de la mienne mais c'est beaucoup plus vicieux que ça .

Diagnostique du problème

Problème de script ?

Que se soit SSA (Server Side Actionscript) ou CSA (Client Side Actionscript), je n'avais mis aucune limite et des scripts similaires utilisés par le passé ne m'ont jamais posé ce genre de problèmes.

Problème de version du serveur ?

Chez moi je travaille avec Flash Media Server 2 (FMS2) developer Edition, chez mon client dans l'environnement de dev j'ai essayé avec FMS2 sous Windows Small Business Server 2003 (SBS2003 R2 SP2) et avec Flash Media Interactive Server 3 (FMIS3) sous CentOS.

Même problème avec les 2 OS.

Problème de configuration serveur ?

Les scripts étant quasi identiques, les vidéos n'étant pas stockées sur un emplacement réseau mais bien sur le HD du serveur, un problème de config me semblait la piste la plus plausible. Vu que ma webTV se connecte à un service proxy se trouvant sur un autre fms j'ai bien évidemment vérifié toute la config de Flash Media Server mais nada : les limites de bandes passantes étaient ok, le ratio du buffer aussi,... Pour être certain j'ai "joué" avec les paramètres en les mettants au max puis au min mais toujours le même problème : ça saccade !

J'ai donc repris mes vidéos perso que j'ai copiées sur le serveur du client et là pas de saccades !?

Problème d'encodage ?

Bon maintenant je savais que c'était la vidéo le problème mais quand on joue les flv's posant problèmes avec un soft style VLC ou bien en "download streaming avec PHP" aucune saccade...

Rendez-vous donc sur le site d'Adobe où je trouve les paramètres d'encodages conseillés : je les ai tous essayés - toujours ces foutues jerks.

Le client ayant fourni des vidéos en wmv je me suis demandé si le problème ne viendrait pas de là (de la conversion wmv/flv), j'ai donc ré-essayé d'encoder une bande annonce wmv en flv avec les paramètres par défaut "DV400" de flash video encoder 8 et là test : aucune erreur, pas de problème de saccades.

Je reprend donc une vidéo du client et la réencode avec ces paramètres et plus de saccades ! Je décide donc de faire tout ré-encoder en DV400 mais sans la piste son histoire de gagner du temps et là une centaine de vidéos encodées après : les saccades reviennent .

La seule différence était la non prise en compte de la piste son. Bon je me suis dit c'est sans doute un problème de BufferRatio dans la config FMS et bien oui et non : en fait on peut mettre la valeur que l'on veut ça ne changera rien. Apparemment FMS bug quand il doit traiter une vidéo sans piste son. Vu que je veux garder une bonne synchro niveau leeping pour d'autres applications, je remet le buffer ratio à 0.5.

Solutions

Deux propositions

Soit
  • Éditer toutes les vidéos et mettant une bande son vide avant d'encoder en flv - solution très couteuse en terme de temps de travail et de plus ça aurait explosé mes deadlines ce qui n'était même pas envisageable.
  • Garder la bande son et retirer le son coté interface client - sans doute plus couteuse en bande passante (en cas de gros trafic sur le site web) mais permettra de mettre le son sur les previews sans devoir tout réencoder le jour où le client le souhaitera.


J'ai donc choisi la seconde solution et tout réencodé avec la piste son. Mes deadlines ont donc pu être ainsi respectées, les vidéos sont guère plus lourdes et surtout d'une fluidité absolue.
smiley myconcept:actionscript & php développement et management pour applications RIA (internet, intranet et extranet)

- MY Concept FlashPlayer Loader for actionscript demo's and movie/animation player-