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)
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 :
- Blog de Stefan Richter (stoem de flashcomguru) : 'Streaming' flv video via PHP
- Blog de Ritesh Jariwala (Actkid) : Stream flv with PHP
- Blog de Frédéric v. Bochmann : Seeking Flash FLV video files with PHP, 'à la Google'
- Blog de Brad Murray: PHP Flash Streaming
- Composants payants pour le PHP Streaming du français Lucas : Rich Media Project
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 :
- Encoder votre vidéo
- Injecter les metadata. Pour ceci, il existe deux produits gratuits :
- FLV MetaData Injector de Buraks : http://www.buraks.com/flvmdi/
Buraks propose aussi l'outil payant Captionate
pour mettre des sous-titres multilangues.
- FLVTool2 : http://www.inlet-media.de/flvtool2
- FLV MetaData Injector de Buraks : http://www.buraks.com/flvmdi/
- Uploader votre vidéo sur votre serveur PHP
- Uploader le fichier flvprovider.php
- Créer un fichier fla et glisser/déposer un composant FLVPlayback en le nommant myPlayer.
- Ajouter une layer et le code suivant :
import mx.video.VideoPlayer;
VideoPlayer.DEFAULT_INCMANAGER = "phpstreamvideo.PHPStreamNCManager";
var _forceINCManager:phpstreamvideo.PHPStreamNCManager;
#include "phpstreamvideo/videoPlayerPatch.as" - 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 :
- width="320", height="240", maximum-bitrate-value="260", framerate="15.00", keyframe-interval="60" en "2 pass"
- audio samplingrate="22050" bitrate="40" flvaudioformat="mp3" stereo="TRUE"
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