Le blog de Jean David TECHER, un Réunionnais à Avignon

Aller au contenu | Aller au menu | Aller à la recherche


mardi 3 février 2009

[Ffmpeg/Flvmdi/JW Player] Streaming en Flash avec pause, lecture avancée sur une vidéo flv d'un épisode d'Oggy et les cafards

Le but ici est de proposer une suite d'outils qui permettent de pouvoir regarder une vidéo avec avance rapide, arrêt sur image etc...

Le but est d'obtenir cette superbe vidéo sur laquelle on peut avancer, mettre sur pause, reculer etc...

1. Ffmpeg: conversion du avi en flv

L'épisode ayant une durée de 23 minutes pour un affichage en 352x288, on pourra rogner certaines paramètres dont qmax=31

./ffmpeg -i Oggy_2006-06-05-11-50-01.avi -y -b 700k -qmin 5 -qmax 31\
 -s 352x288 -acodec libfaac -ar 11025 -ab 92k -f flv Oggy_2006-06-05-11-50-01.flv

Bien sûr ici, j'utilise ma version ffmpeg full static compilée maison disponible à http://www.davidgis.fr/download/ffmpeg-fullstatic-svnr16921.tar.bz2 ou à http://www.davidgis.fr/download/ffmpeg-ffserver-fullstatic-svnr16676.tar.bz2

2 Flvmdi: ajout des metatags

L'ajout des metatags permet justement de pouvoir naviguer dans la vidéo.

Il faut utiliser une utilitaire comme flvmid.exe. Ce dernier est disponible à http://www.buraks.com/flvmdi/. Mon fichier ne dépassant pas la limite autorisée, je peux donc me livrer à la conversion. Bien sûr ce binaire étant prévu pour Windaube, il faut recourir à Wine

wine flvmdi.exe Oggy_2006-06-05-11-50-01.flv /k /l /p

qui affichera


Manitu Group FLV MetaData Injector 2.94
Copyright (c) 2004-2007 Manitu Group. http://www.buraks.com/flvmdi

 Loading FLV File...
  Reading FLV header
  Finished.
  Reading FLV tags
  4% done
  8% done
  11% done
  19% done
  26% done
... ....  
85% done
  89% done
  93% done
  97% done
  Finished.
 Finished.
MetaData injected (in memory).
 Saving FLV File...
 4% done
 8% done
 12% done
 16% done
 20% done
 ... ....
89% done
 93% done
 97% done
 Finished.
Completed.

3. JW Player: lecteur Flash adéquate

Ce lecteur est parfait pour ma lecture. Il s'installe en suivant les indications disponibles à http://nwayvideo.com/phpflvplayer/index.html

Dans l'exemple à télécharger (j'ai pris le n°2), il faut récupérer les fichiers disponibles dans le sous-répertoire scripts: flvprovider.php, phpsflvplayer.swf, playerProductInstall.swf, swfobject.js

Le code sera donc

<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
var attributes = {};

var params = {};
// for fullscreen
params.allowfullscreen = "true";
var flashvars = {};
// the video file or the playlist file
flashvars.file = "video.flv";
// the PHP script (1.5 is a recommended value for PHP Streaming for bufferlength)
flashvars.streamscript = "flvprovider.php";
flashvars.bufferlength = "1.5";
// width and height of the player (h is height of the video + 20 for controlbar)
// required for IE7
flashvars.width = "352";
flashvars.height = "288";
// width and height of the video
flashvars.displaywidth = "352";
flashvars.displayheight = "288";
flashvars.autostart = "false";
flashvars.showdigits = "true";
// for fullscreen
flashvars.showfsbutton = "true";
// 9 for Flash Player 9 (for ON2 Codec and FullScreen)
swfobject.embedSWF("phpsflvplayer.swf", "flashcontent", "352", "288", "9.0.0","playerProductInstall.swf", flashvars, params, attributes);
</script>
<div id="flashcontent"></div>

[Ffmpeg] Streaming vidéo - SVN Révision 16676en full static

C'est la seule révision du dépôt que j'ai pu trouvé qui ne pose pas de problème pour faire du streaming.

0. Scénario - Client/Serveur

Mon serveur de streaming est à Montpellier. Il est composé du couple ffserver/ffmpeg. Je suis sur Antibes pour essayer de regarder une vidéo sur le disque dur de mon ordinateur à Montpellier (= le serveur).

1. Téléchargement

Les binaires sont disponibles à http://www.davidgis.fr/download/ffmpeg-ffserver-fullstatic-svnr16676.tar.bz2 en full static comme toujours .

<2. Côté serveur à Montpellier

2.a) Port pour le serveur

Pour ce scénario, on va ouvrir le port sur le serveur sur un port comme 8090.C'est le port par défaut du fichier de configuration. Un petit coup d'iptables donnera donc les commandes suivantes

PORT=8090
$IPTABLES -A INPUT -i $INTERFACE_INTERNET -p tcp --dport $PORT -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport $PORT -j ACCEPT

2.b) Fichier de configuration de ffserver

Le fichier de configuration ffserver.conf sera le suivant

Port 8090
BindAddress 0.0.0.0
MaxClients 1000
MaxBandwidth 30000
NoDaemon
<Feed feed1.ffm>
	File /tmp/feed1.ffm
	FileMaxSize 0
        ACL allow 127.0.0.1
	ACL allow XXX.YYY.UUU.VVV
	ACL allow 82.236.232.???
</Feed>

<Stream test.swf>
	Feed feed1.ffm
	Format swf
	VideoFrameRate 7
	VideoBufferSize 80000
	VideoBitRate 400
	VideoQMin 3
	VideoQMax 5
	VideoSize 320x240
	PreRoll 10
        ACL allow 127.0.0.1
	ACL allow XXX.YYY.UUU.VVV
	ACL allow 82.236.232.???
</Stream>

<Stream stat.html>
	Format status
	ACL allow XXX.YYY.UUU.VVV
</Stream>

<Redirect index.html>
	# credits!
	URL http://ffmpeg.sourceforge.net/
</Redirect>

où XXX.YYY.UUU.VVV est mon IP sour Antibes et 82.236.232.??? est l'IP de mon serveur sur Montpellier.

2.c) Lancement de ffserver

On se connecte en ssh sur le serveur et on effectue

/chemin/vers/ffserver -f /chemin/vers/ffserver.conf

Ce qui donnera


Fig 1. Lancement de ffserver.

Maintenant, il faut envoyer un flux par ffmpeg

2.c) Lancement d'un flux à streamer par ffmpeg vers le serveur

Dans un autre terminal, on se connecte par ssh et on effectue la command suivante

/chemin/vers/ffmeg/ffmeg -i fichier_video_a_streamer http://localhost:8090/feed1.ffm

Soit par exemple l'image suivante


Fig 2. Proposition de flux par ffmpeg à ffserver.

Dans le terminal de ffervser, on vérifie qu'on a bien reçu le flux


Fig 3. Réception de fflux de ffmpeg par ffserver.

Côté client à Antibes.

Mon IP ayant été spécifiée comme recevable dans le fichier de configuration, je peux donc essayer d'interroger le flux par mplayer ou VLC en faisant

mplayer http://www.davidgis.fr:8090/test.swf

Et oh miracle de la sainte-linux


Fig 4. Réception du film.