Laisser un commentaire

PHP et la vidéo avec ffmpeg-php

FFMPEG php, à l’instar de FFMPEG, est le genre d’outil qu’on ne se lasse jamais de présenter. FFMPEG PHP offre des classes permettant de “discuter” en php avec FFMPEG. On peut donc récupérer toutes sortes d’info sur des vidéos, en extraire des images etc. En revanche, il n’est pas possible d’encoder directement d’un format à un autre avec FFMPEG PHP. Pour cela, il faudra passer par FFMPEG tout court.

Je ne donnerai ici qu’un aperçu de quelques commandes, pour le reste, il y a la doc officielle.

Prérequis

FFMPEG PHP, n’est pas installé par défaut avec php. En outre, certaines fonctions de FFMPEG php nécessitent la librairie GD de php. Celle-ci est normalement installé avec PHP dans les versions récentes de ce dernier.

# Install de ffmpeg php pour les distributions à base de debian
sudo apt-get php5-ffmpeg

Récupérer des informations sur les vidéos

C’est la classe ffmpeg_movie qui va nous permettre de récupérer les informations sur la vidéo. Cette classe prend de très nombreuses méthodes (cf la doc.), parmi lesquelles :

getDuration()
Renvoie la durée en secondes.
getFrameCount()
Renvoie le nombre total d'images dans la vidéo.
getFrameWidth()
Renvoie la largeur de l'image en pixels.
getFrameHeight()
Renvoie la hauteur de l'image en pixels (donc getFrameWidth*getFrameHeight vous fournit la résolution de votre vidéo).
getFrameRate()
Renvoie le nombre d'images/sec.
getBitRate()
Renvoie le bitrate en bits/sec (attention à bien interpréter, on a l'habitude d'utiliser les Kbits voir les Mbits).
getAudioBitRate()
Même fonctionnement que getAudioBitRate() mais pour l'audio.
getVideoCodec()
Renvoie le nom du codec qui a été utilisé pour encoder la video.
getAudioCodec()
Même fonctionnement que getAudioCodec() mais pour l'audio..
getFrame()
Renvoie l'image correspondante au paramètre passé, comme si on avait invoqué la classe ffmpeg_frame. Retourne false si aucune image ne correspond au paramètre.

Par exemple, si nous avons une vidéo “video.avi”, dans le répertoire vidéo de notre racine web. Nous pouvons récupérer la durée de la vidéo (en secondes je le rappelle ;) ), et le nombre total d’images de la vidéo, comme ceci :

$videoInfo = new ffmpeg_movie('videos/video.avi');
$videoLenth = $videoInfo->getDuration();
$videoFrames = $videoInfo->getFrameCount();

Les bariables $videoLenth et $videoFrames contiennent donc chacune un nombre entier correspondant respectivement à la durée et aux nombre d’images !

Extraire des images et les modifier

C’est déjà plus puissant !! Les fonctions de création et modification des images sont relatives à la classe ffmpeg_frame. Cependant, comme vous l’avez peut-être lu juste au-dessus (comment ça non ? :evil: ), il est possible d’utiliser toutes ces méthodes directement avec la classe ffmpeg_movie, en appelant d’abord la méthode getFrame(). Il y a beaucoup moins de méthodes ici, passons en revue les plus intéressantes :

getWidth()
Renvoie la largeur de l'image.
getHeight()
Renvoie la hauteur de l'image.
resize(entier Hauteur, entier Largeur)
Redimensionne l'image.
crop(entier)
Coupe les x pixels du haut de l'image par défaut. Il faut sinon préciser cropbottom pour le bas, cropleft pour la gauche, ou cropright pour la droite.
toDGImage()
Retourne une image affichable grâce à la librairie GD.

Note : certaines versions de ffmpeg-php ne supporte pas le redimmensionnement. Vous le saurez si vous avez une erreur du type Call to undefined method ffmpeg_frame::resize(). Dans ce cas, laissez tomber, enregistrez les images en plein taille et redimensionnez les par la suite avec GD.

$videoInfo = new ffmpeg_movie('../../src/vids/toencode/mp4/'.$name.'.mp4');
$videoFrames = $videoInfo->getFrameCount();
$largeur = $videoImage->getWidth();
$hauteur = $videoImage->getHeight();

// ici je divise le nombre d'images de la video par 2,
// ainsi je prendrai ma miniature en plein milieu de la video
$videoImage = $videoInfo->getFrame($videoFrames/2);


// je veux des miniatures de 300px de large je calcule donc le % de réduction pour avoir
// une largeur de 300px et une hauteur proportionnelle
$pourcentageReduction = (300/$largeur)*100;

// je calcule donc mes nouvelles valeur en appliquant la focntion
// ceil qui arrondit à l'entier supérieur (on ne peut pas avoir des moitiés de pixels !)
$newLargeur = ceil($largeur*($pourcentageReduction/100));
$newHauteur = ceil($hauteur*($pourcentageReduction/100));
$miniature = $videoImage->resize($newHauteur, $newLargeur);

$img = $miniature->toGDImage();
imagejpeg($img, 'mon_dossier/ma_miniature.jpeg');

Voilà, nous avons a peu près fait le tour.

PS : ffmpeg-php, bien que tout a fait fonctionnel, n’est plus maintenu [en]. Il y a une nouvelle bibliothèque PHP qui permet de manipuler les vidéos (elle permet même de lancer les encodages depuis php). Cette bibliothèque s’appelle php ffmpeg et est maintenu par SensioLabs (l’équipe qui est derrière Symfony).

Commentaires

Rejoignez la discussion !

Vous pouvez utiliser Markdown pour les liens [ancre de lien](url), la mise en *italique* et en **gras**. Enfin pour le code, vous pouvez utiliser la syntaxe `inline` et la syntaxe bloc

```
ceci est un bloc
de code
```