Manipulez des vidéos en Php avec ffmpeg-php
Le projet ffmpeg-php est, comme son l'indique, une interface Php au projet ffmpeg, une application conçue pour manipuler les flux audios et vidéos et basé sur libavcodec, ce qui lui permet de gérer un grand nombre de format de compression dont : MPEG-1, MPEG-2, MPEG-4 Part 2, H.264, WMV,
MJPEG, Theora, FLAC, MP2, MP3, RealAudio 1.0, RealAudio 2.0, Vorbis, Windows Media Audio...
ffmpeg-php est notamment utilisé par Vimeo pour la création des vignettes lors du téléchargement des vidéos, c'est le gage d'une application stable et optimisée.
L'installation
L'installation est très simple puisque c'est une simple extension Php qu'il suffit de déclarer dans le php.ini...
Sous Gentoo, l'installation peut se résumer à cette ligne de commande :
$ sudo emerge -v ffmpeg-php
Ensuite, il suffit d'éditer le fichier php.ini et de déclarer la nouvelle extension afin que Php la charge au démarrage :
extension=ffmpeg.so
Recharger la configuration de votre serveur web, et voilà, nous sommes prêt à jouer avec ffmpeg-php...
Et maintenant, jouons !
Comme nous l'indique la documentation de l'API, il existe 2 types d'objets avec ffmpeg-php :
- movie qui est retourné par ffmpeg_movie(), c'est un objet contenant des méthodes permettant d'obtenir tout un tas d'informations sur le fichier courant, c'est la première fonction que nous utiliserons
- frame renvoyé par getFrame() et getNextKeyFrame(), il s'agit là d'une image fixe extraire du flux vidéo
Commençons par obtenir des informations sur la vidéo :
<?php
$mov = new ffmpeg_movie('/path/to/video.avi');
echo sprintf('<p>Duration : %.1f, bit rate : %d, frame count : %d, video codec : %s, audio codec : %s, audio channel : %s</p>',
$mov->getDuration(),
$mov->getBitRate(),
$mov->getFrameCount(),
$mov->getVideoCodec(),
$mov->getAudioCodec(),
$mov->getAudioChannels());
?>
Qui devait afficher quelque chose comme ceci :
Duration : 18.7, bit rate : 2169054, frame count : 283, video codec : mjpeg, audio codec : pcm_u8, audio channel : 1
Essayons maintenant de lire la frame 23 et de l'envoyer au navigateur :
<?php
// On charge la vidéo
$mov = new ffmpeg_movie('/path/to/video.avi');
// Récupère la frame 23
$frame = $mov->getFrame(23);
// Transforme la frame récupérée au dessus en ressource GD
$img = $frame->toGDImage();
// Envoie l'image au navigateur
header("Content-type: image/jpeg");
imagejpeg($img);
?>
Et voilà, déconcertant de simplicité ! non ?
La suite
Ci-joint, en annexe, un petit bout de code qui vous affichera les informations sur la vidéo, créera 50 miniatures et affichera enfin la vidéo convertie en animation GIF.
Un aperçu du résultat :
Amusez-vous bien !



Commentaires
merci à Hugo pou cette image
Merci pour ces scripts! Mais est-il possible de le faire avec un flv?
J'ai beau tester ça ne marche pas m'indiquant ce message d'erreur :
"Call to a member function on a non-object"
Avec un .avi et .wmv je n'ai pas ce problême, et j'ai beau chercher sur le net je ne trouve rien
Merci pour ce tuto,
Mais comment faire l'installation sous windows?
Merci
http://www.phpcs.com/forum/sujet-FF...
tu as pas mal d'infos dans cette page
bonjour j'ai un petit problème losrque j'éxecute $img = $frame->toGDImage();
cela me met en erreur:
Fatal error: failed to convert frame to gd image in /var/www/lecap/gestionEnvoivideo.php on line 144
salut tous;
merci hugo pour ces informations, mais t'as oublié de donner la class: ffmpeg_movie pour pouvoir executer ce programme.
cordialement.