PhilFlash

Vidéo FLV en PHP Streaming et avec le FLVPlayback

19 Mai 2007 - Il y a des bugs bloquants avec le Flash Player 9 - Bugs with Flash Player 9 (crash browser) - Consulter la nouvelle solution avec le Flash Video Player de Jeroen Wijering

Traduire/Translate : English (by Google) - Deutsch (by Google)

Obtenir les sources phpFLVplaybackv080.zip (320 Ko) BETA VERSION 0.80 du 2 mai 2006 (release)

19 Mai 2007 - Il y a des bugs bloquants avec le Flash Player 9 - Bugs with Flash Player 9 (crash browser) - Consulter la nouvelle solution avec le Flash Video Player de Jeroen Wijering

Introduction à la vidéo en PHP Streaming

Pour voir des vidéos en Flash, il existait deux modes : le progressive download ou le streaming.

Depuis fin 2005, il existe un troisième mode : le PHP Streaming.

L'idée est d'avoir les avantages du Streaming (vidéo longue, vidéo non chargée sur le poste client, possibilité de se positionner à un endroit précis) sur un serveur "tout simple" en PHP.

Pour ceci, on utilise des metadata qui sont injectées dans le fichier vidéo FLV. Le lecteur vidéo utilise ces metadata pour visualiser et se positionner dans la vidéo.

Voici quelques liens sur la vidéo en PHP Stream :

FLVPlayback pour le PHP Streaming

L'idée du PHP Streaming est intéressante mais le nouveau composant FLVPlayback ne permettait pas de lire les vidéo en PHP Streaming.

Voici donc ma pierre à l'édifice et une première version du FLVPlayback pour lire la vidéo en PHP Streaming.

PHPStreamNCManager

Pour ceci, on crée un nouveau NCManager (NetConnection) pour pouvoir accèder au VideoPlayer pour le PHPStreaming. On a donc une nouvelle classe : PHPStreamNCManager. Le code est fourni avec les sources.

Pour prendre en compte le nouveau NCManager, il suffit d'écrire :

import mx.video.VideoPlayer;
VideoPlayer.DEFAULT_INCMANAGER = "phpstreamvideo.PHPStreamNCManager";
var _forceINCManager:phpstreamvideo.PHPStreamNCManager;

Hack sur VideoPlayer

Malheureusement, le code du VideoPlayer n'est pas aussi propre que cela : il est hardcodé : on est en mode streaming (isRTMP) ou pas. Ajouter un troisième mode n'est pas si simple...

J'ai donc essayer de patcher/hacker le VideoPlayer "au minimum". On se retrouve avec un fichier videoPlayerPatch.as

Pour le seek, on a déporté le calcul de la position dans le PHPStreamNCManager avec la méthode computeSeek. Ça ne devrait pas être dans cette classe mais je ne voulais pas trop hacker le VideoPlayer.

Pour prendre en compte les patchs, il suffit d'écrire :

#include "phpstreamvideo/videoPlayerPatch.as"

FLVPlayback

Pour prendre en compte un fichier vidéo en PHP Streaming, il suffit d'associer le path de la vidéo avec la forme suivante : PHPS:http://myserver/mypath/flvprovider.php?file=myvideo.flv

ListSceneController

L'idée est d'avoir un composant List pour sélectionner une scène dans le FLVPlayback (idée inspirée de l'article du DevNet : Creating a Dynamic Playlist for Streaming Flash Video).

Les scènes sont représentées dans un fichier XML :

<scene time="0.00" image="image/lipopropulsion.jpg">
        <title><![CDATA[Démarrage]]></title>
        <description>Où trouver de l'huile à patate ?</description>
</scene>

Pour gérer des styles dans le composant List, on utilise le HTMLCellRenderer adapté au composant List.

Un contrôleur ListSceneController permet d'effectuer le lien entre la List et le FLVPlayback.

La sélection d'un élément de la List, nous permet de se positionner dans la vidéo avec la méthode seekSeconds.

Pour chaque scène, on crée un CuePoint ActionScipt. Lorsque ce cuepoint est activé, on sélectionne l'élément dans la liste (d'après une démo de Robert Reinhardt).

Comment ajouter une vidéo en PHP Streaming

Voici la marche à suivre :

  1. Encoder votre vidéo
  2. Injecter les metadata. Pour ceci, il existe deux produits gratuits :
  3. Uploader votre vidéo sur votre serveur PHP
  4. Uploader le fichier flvprovider.php
  5. Créer un fichier fla et glisser/déposer un composant FLVPlayback en le nommant myPlayer.
  6. Ajouter une layer et le code suivant :

    import mx.video.VideoPlayer;
    VideoPlayer.DEFAULT_INCMANAGER = "phpstreamvideo.PHPStreamNCManager";
    var _forceINCManager:phpstreamvideo.PHPStreamNCManager;
    #include "phpstreamvideo/videoPlayerPatch.as"

  7. Vous pouvez définir le contentPath du FLVPlayback soit avec les propriétés du composant ou en Action Script (en path absolu ou relatif)

    myPlayer.contentPath = "PHPS:http://www.inwayvideo.com/psdemo1/flvprovider.php?video.flv
    ou
    myPlayer.contentPath = "PHPS:flfprovider.php?video.flv

La vidéo de l'exemple : Rouler à l'huile

La vidéo est une vidéo en Creative Commons license: Lipopropulsion de Radhanath Gagnon, Mathieu Poulin, Raphael Lorand et David Chabot.

Cette vidéo présente comment rouler avec de l'huile végétale. Vu l'augmentation du prix de l'essence, une vieille solution à redécouvrir. Les premiers moteurs diesels utilisaient de l'huile végétale : voir Rudolf Diesel.

Vous pouvez la télécharger en différents formats ici : http://www.archive.org/details/collectifLipopropulsion

C'est une vidéo de 7:32 minutes. Elle a été encodée avec l'encoder Flix Pro d'ON2 à 300K avec les paramètres suivants :

Le fichier FLV a une taille de 17 347 Ko (17 mégas).

Bugs et release

version 0.80

La buffering bar fonctionne dans IE (mais pas dans FireFox car on reçoit des événements NetStream.Play.Stop qui l'annule).

On introduit des points de navigations pour les boutons back et forward du FLVPlayback. Ces points peuvent être calculés à partir du ListSceneController (méthode createSceneNavigationCuePoints) ou à intervalle de temps régulier (méthode createTimeNavigationCuePoints).

Le calcul de la position du seek a été optimisé (pour les très longues vidéos).

version 0.60

Ceci est une version Beta. J'ai eu un gros bug avec Firefox qui est corrigé dans la version 0.6

On reçoit des évènements différents sur le NetStream selon le navigateur. Par exemple, on reçoit des événements "NetStream.Play.Stop" avec Mozilla FireFox qui n'existent pas sous Internet Explorer...

La mise au point est donc difficile car le comportement dans un navigateur n'est pas le comportement dans l'environnement de développement Flash 8.

Version

version 0.80 - 2 mai 2006
        - New : New method to improve performance to compute seek position
        - New : Buffering bar when buffering in IE
                      In Firefox, we receive NetStream.Play.Stop that stop the buffering bar
        - New : Two new methods for adding navigation cue points for back and forward button
                       createSceneNavigationCuePoints and createTimeNavigationCuePoints
        - Some minor fixes and improvements

version 0.7 beta - 29 Mars 2006 : ajout du ListSceneController - phpFLVplaybackv070.zip

version 0.6 beta - 19 Mars 2006 : Mozilla Firefox bug corrected on seek - phpFLVplaybackv061.zip

version 0.5 beta - 17 Mars 2006 : version initiale

 

Me connaître  |  Me contacter