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 :

ffmpeg-php au boulot

Amusez-vous bien !