Stream video en flv à la volée avec ffmpeg

Publié le 31/12/2008

Sur ma Wii, je ne peux pas lire mes DVD ni mes MP3 sans avoir à les copier sur des cartes SD cards… streamer cela depuis mon PC de bureau me plairait. La solution est de passer par le navigateur (Opera) de la Wii qui ouvre un lecteur flash (swf) qui va lire une FLV.

Jusque là, à peu prés tout le monde sait encoder une vidéo dans le format flv avec un encodeur, c’est simple: ça fait un fichier FLV qu’on peut alors lire sur une page avec un petit lecteur flash.

Oui mais ! 300Go de vidéos, de musiques etc… à encoder en FLV **non merci**… du coup, je me suis développé un truc sous Copix qui me permet de lire mes média sur ma Wii.

Je vous donnerai ça plus tard, pour l’heure je vous explique juste l’astuce.

Sur mon PC de bureau, Linux Fedora 9 avec **ffmpeg** installé. Cet encodeur permet de convertir un média dans plusieurs formats différents. Intéressant, il sait envoyer le flux dans un fichier ou directement dans STDOUT (la sortie standard).

En gros, la commande pour écrire dans un fichier:

ffmpeg -i mon_film.avi -f flv -s vga -y mon_film.flv

Ici, j’encode mon_film.avi en mon_film.flv (en format VGA 640x480 etc…) Bref mon but c’est de ne pas attendre que l’encodage soit terminé pour lire mon fichier et ne pas avoir à stoker mon fichier flv sur le disque. Voilà donc comment faire :

#ne tapez pas encore cette commande dans le terminal, attendez la suite de l'article
ffmpeg -i mon_film.avi -f flv -s vga -

Ce tiret en fin de commande demande à ffmpeg d’écrire dans la sortie standard. Si vous tapiez cette commande dans le terminal vous verriez des caractères exploser partout et donc rendre votre ligne de commande illisible… pour le moment, on va s’amuser à lire notre flux converti à la volée dans mplayer ou xine:

#avec mplayer
ffmpeg -i mon_film.avi -f flv -s vga - | mplayer -

#avec xine
ffmpeg -i mon_film.avi -f flv -s vga - | xine -

Voilà, ce qui sort de ffmeg part directement dans le lecteur. Maintenant on va appliquer cette méthode à PHP :) Lire un flux de sortie avec PHP se fait grâce à popen(), on va lire le flux et l’envoyer dans le navigateur en tant que FLV.

` //stream.php

//on commence par donner quelque entête au navigateur qui en aura //certainement besoin header(“Expires: Mon, 01 Jan 1981 01:00:00 GMT”); header(“Last-Modified: “ . gmdate(“D, d M Y H:i:s”) . “ GMT”); header(“Cache-Control: no-store, no-cache, must-revalidate”); header(“Cache-Control: post-check=0, pre-check=0”, false); header(“Pragma: no-cache”); header(“Content-Type: video/x-flv”);

//on ouvre la commande et on va lire le flux sortant $handle = popen(‘ffmpeg /repertoire/monfilm.avi -s vga -f flv -’); while (!feof($handle)){ print(fread($handle,1024*16)); //je lis des blocs de 16ko } pclose($handle); `

Reste à prendre un lecteur FLV en flash, n’importe lequel fera l’affaire et de lui indiquer le chemin **http** vers le script stream.php créé ci-dessus.

Et oui, ça fonctionne !

Vous pouvez évidemment adapter la commande ffmpeg pour encoder plus fort, changer le bitrate, changer la taille… Bref, cette méthode marche très bien chez moi :)

comments powered by Disqus