Stream video en flv à la volée avec ffmpeg

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 :)

Ça peut vous intéresser aussi


Streaming PHP pour video ogv

Il est possible de streamer un flux avec PHP. En ...


Streaming, mais pourquoi

Lorsque l’on parle de “streaming” arrive toujours l’...


Thread PHP dans Copix

Alors qu’on discutait sur le canal #fedora-fr de langages,...


Balise video ou le standard pas standard

Alors que Firefox 3.5 voit le jour, nous entendons ...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

[SiMON] - 31/12/2008

Si j’puis m’permettre, l’idée n’est pas nouvelle : Weezo (http://weezo.net/) fait ça depuis longtemps (avec tout un tas d’options) et fonctionne à merveille avec une Wii.

Metal3d - 05/01/2009

Ha mais je n’ai pas dit que c’était nouveau :) j’ai dit que c’était simple et que cela ne demande que quelques lignes de PHP. Il existe des tas de trucs pour faire pareil, parfois lourds, parfois moches…

Bref, l’idée ici est de montrer comment faire un stream depuis un fichier sans passer par une conversion en deux temps.

Cela peut être super utile pour un site qui n’a pas de grosse fréquentation et qui veut streamer une vidéo sans devoir passer par une conversion et prendre de la place sur DD. Oui, cela fait bobo au CPU, mais j’ai bien préciser “qui a une faible fréquentation”… une conversion par heure ça fait pas grand chose :)

Mieux, imagine un module Copix qui permette de streamer un divx rapidement tant que le FLV n’est pas prêt… bref, je voulais montrer un truc sympa et rapide.

Sadar - 22/03/2009

Hello,

Perso je serais assez intéressé pour avoir le bout de code qui va bien pour la redirection vers le lecteur flash, car je galère depuis déjà quelques jours pour mettre au point ce genre de truc.

Ben vi, chui plutôt une buez en programmation php etc ;-//

themadmax - 05/03/2013

Très intéressant comme script. Mais tu as oublié le “-i” dans la syntaxe de la commande FFMPEG

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.