DigitalSpirit / Blog

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 :

ffmpeg-php au boulot

Amusez-vous bien !

Ouvrir l'article

Css3 en action avec Firefox 3.1b1pre

Voici une petite vidéo de ce qu'il sera possible de faire avec les CSS3, et, notamment, les transformations proposés par WebKit et border-image.

Css3 in action with Firefox 3.1b1pre


Css3 in action with Firefox 3.1b1pre from hugo on Vimeo.

Pour le déplacement des post-it, j'ai utilisé jquery-ui, j'aurai tout à fait pû utiliser -moz-transform: translate() mais le but était, évidemment, de montrer quelque chose qu'on a pas l'habitude de voir : la rotation et le redimensionnement d'objet en CSS...

Actuellement, la spécification n'est encore qu'un brouillon (ce qui explique l'utilisation du préfixe "-moz-") mais il existe un comportement, qui me semble gênant, ainsi, si on souhaite appliquer une transformation de type rotation ou redimensionnement, il faut passer par le mot-clef Css -moz-transform, édudiez l'exemple suivant :

p {
-moz-transform: rotate(15deg);
-moz-transform: scale(2);
}

Que va-t-il se passer ?
Les élements paragraphes vont subir une transformation de type scale, c'est tout, pas de rotation, le problème est qu'on ne peut pas, pour le moment, définir une transformation sans modifier les autres, ainsi, si une feuille de style externe veut appliquer une rotation à tous les élements p de la page, elle pourra le faire mais en "écrasant" aussi les autres transformations...cela est tout à fait normal à vrai dire, c'est écrit dans la spécification... 

Ne serait-il pas judicieux de créer des propriétés transform-rotate, transform-scale, transform-skew...?

Ouvrir l'article

Vie de merde dans vos scripts Php ...simplement

Pour afficher aléatoirement les fortunes de Vie de merde en Php de la manière la plus simple qu'il soit, vous pouvez faire comme ci dessous...ou pas...

<?php

header('Content-type: text/html; charset=UTF-8');

$xml = simplexml_load_file('http://api.viedemerde.fr/1.2/view/random?key=readonly');

echo <<<EOD
<html>
<body>
<h1>{$xml->vdms->vdm->categorie}</h1>

<p>
<a href="http://www.viedemerde.fr/{$xml->vdms->vdm['id']}">#</a>
{$xml->vdms->vdm->texte}
</p>
</body>
</html>
EOD;

?>

Voilà, rien de bien sorcier, donc, pas d'explication, vous pouvez retourner à vos occupations, je vais en faire de même !

Ouvrir l'article

Connection ssh sans mot de passe

Billet pense-bête, ça m'évitera de chercher si j'ai un trou de mémoire :)

Il est possible de se connecter sans saisir de mot de passe sur une machine distante en SSH, chose très pratique lors de l'administration de plusieurs machines...

Si ce n'est pas encore fait, il vous faut générer votre paire de clef publique / privée, pour cela, entrez la commande suivante :

$ ssh-keygen

Il vous demandera :

  • L'endroit oû stocker les clefs, (~/.ssh/id_dsa par défaut)
  • Une phrase faisant office de mot de passe, laissez cette dernière vide

Ensuite, il faut copier la clef publique dans le fichier ~/.ssh/authorized_keys du pc distant, vous pouvez le faire manuellement avec la commande scp, mais il existe plus simple :

$ ssh-copy-id user@domain.tld

Voilà, vous pouvez dorénavant vous connecter à votre machine sans mot de passe.

Prenez garde à n'utilisez cette méthode qu'à partir d'une machine "de confiance"...

Ouvrir l'article

Onglets dans la même instance de GVim

Voilà une petite astuce pour les utilisateurs de GVim qui vous permettra d'ouvrir tous vos documents dans la même instance grâce aux onglets.

La page Vim documentation : remote nous apprend qu'il est possible de faire fonctionner Vim comme un serveur recevant des messages de clients et exécutant les commandes demandées par ces derniers.
Une de ces commandes nous intéresse et va justement nous permettre d'ouvrir des documents dans la même instance de Vim, il s'agit de remote-tab-silent.

Testons cette commande :

 $ gvim -p --remote-tab-silent toto

Une instance de GVim s'ouvre avec toto dans un onglet (le paramètre p permet d'ouvrir un onglet par fichier).
Gardons GVim ouvert et testons de nouveau :

 $ gvim -p --remote-tab-silent foo

Le fichier foo s'affiche maintenant dans un nouvel onglet de la même instance GVim, nous avons donc 2 fichiers ouvert dans GVim : toto et foo.

J'ai fait un petit script bash qui permet de s'affranchir des problèmes rencontrés à l'ouverture avec Nautilus (qui tente d'ouvrir les documents avec le paramètre "-f") et qui évite surtout de devoir saisir les paramètres à chaque fois, il suffit alors de remplacer le fichier binaire de gvim par le script :

 $ mv /usr/bin/gvim /usr/bin/gvim-bin

Ensuite, il vous suffit de déposer le script ci joint dans le dossier /usr/bin et de lui attribuer les droits d'exécution.

Bon Gvim !

Ouvrir l'article

Page 1 / 4 »