Encodage et traitement de automatique de vidéos en upload

Soyez le premier à donner votre avis sur cette source.

Vue 31 104 fois - Téléchargée 3 309 fois


Description

Bon, voici mon premier code ...

Voila, je viens de développer cette source qui peut etre utile pour l'upload de vidéo.
Grace à un formulaire, on upload une vidéo dans n'importe quel format (j'ai limité à 7-8 formats dans mon cas), on la redimensionne à la taille souhaitée (pour moi 350x250) , on la coupe au moment voulu (40 secondes dans mon exemple), et plus important, on la ressort dans n'importe quel format. Ce code, utilise le logiciel ffmpeg librement accessible.

Dans mon exemple je travail pour un réencodage en flv mais il y a de tres nombreuses autres finalité, je vous invite a consulter le manuel de ffmpeg pour vous en rendre compte par vous même.

Liste des formats supportés et le manuel de ffmpeg : http://ffmpeg.sourceforge.net/ffmpeg-doc.html#SEC19

pour toute question ou suggestion : yaug_worm@hotmail.com

Merci

Source / Exemple :


<?php

//===================================
//on fixe les variables de php.ini :
//===================================
$res_ini = @ini_set ("MAX_INPUT_TIME", 1200);
@set_time_limit (1200);

//===================================
//obtention de l'extension
//===================================
function getextension($fichier) {
         $bouts = explode(".", $fichier);
         $extension = array_pop($bouts);
         $extension = strtoupper ($extension);
         return $extension;
}//getextension ()

//==================================================
//supression de l'extension dans le nom d'un fichier
//==================================================
function supprextension ($fichier) {
         $fichier= substr ( $fichier, 0, strrpos($fichier, "."));
         return $fichier;
}//supprextension ()

//=====================================
//initialisation des vars et tableaux
//=====================================
$traitable = false;
$is_ext_ok = false;
$path_ffmpeg = "ffmpeg/ffmpeg";
$ext_admise = array ("MOV", "AVI", "MWV", "DV", "MPG", "MPEG", "FLV", "DIVX");
$taille = false;

for ($i=0; $i<3; $i++)
{
  echo "<br>$i<br>";
    $fichier = "fichier".($i+1);
    $source = $_FILES[$fichier]["tmp_name"];
    $nom_fic = $_FILES[$fichier]["name"];
    $size = $_FILES[$fichier]["size"];
    $destination = "./tmp2/".$nom_fic;  //dossier destination
    $nom_final = supprextension ($nom_fic);
    
    if ($size < 25000000)
    {
       echo "<br>taille : $taille<br>size : $size<br>";
       $taille = true;
    }//if ()

    //sortie des qu'il n'y a plus de fichier dans la file d'attente.
    if (!file_exists($source))
    {
       echo "<br>sortie<br>";
       continue;
    }//if ()

//=================================
//initialisation des fichiers logs
//=================================
$nomlogerror = "./log/logerror".$nom_final.".txt";
$nomlogconnect ="./log/logconnect".$nom_final.".txt";
$logerrorpt = @fopen ($nomlogerror, "at");
$logconnectpt = @fopen  ($nomlogconnect, "at");

if (is_writable($nomlogerror))
{
  if (!$logerrorpt)
  {
    echo "<br>impossible d'ouvrir le fichier logerror<br>";
    exit ;
  }//if ()
  else
  {
   $res_write = fwrite ($logerrorpt, "erreurs apparues lors de l'upload et du traitement :\r\n" );
  }//else
}//if
else
{

  echo "<br>fichier non accessible<br>";
}//else
if (is_writable($nomlogconnect))
{
  if (!$logconnectpt)
  {
    $res_write = fwrite ($logerrorpt, "Impossible d'ouvrir $nomlogconnect\r\n");
    exit;
  }//if
  else
  {
    if (!$res_write = fwrite ($logconnectpt, "compte rendu de l'upload et du traitement de la vidéo\r\n\r\n"))
    {
      $res_write = fwrite ($logerrorpt, "\r\nImpossible d'ecrire dans $nomlogconnect\r\n");
    }//if ()

  }//else
}
else
{
  $res_write = fwrite ($logerrorpt, "fichier $nomlogconnect non accessible\r\n");
}//else

//=========================================
//vérification de l'existence de la vidéo
//=========================================
  if (file_exists ("./film_flv/".$nom_final.".flv"))
  {
    $res_write = fwrite ($logerrorpt, "\r\nla vidéo $nom_fic a déjà été uploadée et traitée, arret de l'upload\r\n");
    $res_write = fwrite ($logconnectpt, "\r\nla vidéo $nom_fic a déjà été uploadée et traitée, arret de l'upload\r\n");
    continue;
  }//if ()

//==================
//test de la vidéo
//==================

$extension = getextension ($nom_fic);
echo "<br>extension: $extension<br>";
$res_write = fwrite ($logconnectpt, "dossier source : $source \r\n ");
$res_write = fwrite ($logconnectpt, "nom du fichier : $nom_fic\r\n");
$res_write = fwrite ($logconnectpt, "nom du fichier destination : $destination\r\n");
$res_write = fwrite ($logconnectpt, "extension : $extension \r\n");
$res_write = fwrite ($logconnectpt, "taille : $size\r\n");

if (!in_array ($extension, $ext_admise))
{
   echo "<br>Attention, le fichier que vous venez de sélectionner n'est pas une vidéo au format valide.<br>";
   echo "Les formats utilisables sont : AVI, MPEG, DIVX, MOV, FLV, DV, WMV merci de compresser votre vidéo au format voulu.<br>";
   $res_write = fwrite ($logerrorpt, "\r\nformat vidéo non adapté, extension de la vidéo : $extension, upload arrété \r\n");
}//if ()
else
{
    $res_write = fwrite ($logconnectpt, "\r\nextension de la vidéo ok, poursuite de l'upload \r\n");
    if (/*$size> 26214400*/!$taille)
    {
       echo "<br>Impossible de charger $nom_fic, cette vidéo fait plus de 25Mo, merci de réduire la taille de votre vidéo<br>" ;
       $res_write = fwrite ($logerrorpt, "\r\nla taille de la vidéo $nom_fic est de $size et supérieure à 25Mo, arret de l'upload\r\n");
       continue;
    }//if ()
    else
    {
        $res_write = fwrite ($logconnectpt, "\r\ntaille de la vidéo ok, poursuite de l'upload \r\n");
        $is_ext_ok = true;
    }//else
}//else

//==================
//Début de l'upload
//==================
if ($is_ext_ok)
{
   $res_write = fwrite ($logconnectpt, "\r\ndebut de l'upload de la vidéo \r\n");
   $result = move_uploaded_file( $source, $destination);
   $res_write = fwrite ($logconnectpt, "\r\nresultat de move_upload_file = $result\r\n");

    $erreur = $_FILES[$fichier]['error'];
    echo "<br>erreur : $erreur<br>";
   if (!$result)
   {
      $res_write = fwrite ($logerrorpt, "erreur lors de l'upload : ");
      switch ($erreur)
      {
          case 1: // UPLOAD_ERR_INI_SIZE
               $res_write = fwrite ($logerrorpt, "UPLOAD_ERR_INI_SIZE\r\n");
               echo "Attention le fichier dépasse la taille autorisée par le serveur<br>";
               break;
          case 2: //UPLOAD_ERR_FORM_SIZE
               $res_write = fwrite ($logerrorpt, "UPLOAD_ERR_FORM_SIZE\r\n");
               echo "Attention le fichier dépasse la taille autorisée par le formulaire<br>";
               break;
          case 3: //UPLOAD_ERR_PARTIAL
               $res_write = fwrite ($logerrorpt, "UPLOAD_ERR_PARTIAL\r\n");
               echo "Attention, l'upload du fichier a été interrompu<br>";
               break;
          case 4: // UPLOAD_ERR_NO_FILE
               $res_write = fwrite ($logerrorpt, "UPLOAD_ERR_NO_FILE\r\n");
               echo "Attention, le fichier envoyé à une taille nulle<br>";
               break;
      }//switch ()
      $res_write = fwrite ($logconnectpt, "\r\nune erreur est survenue lors de l'upload de $nom_fic, consultez le log erreur\r\n");
      continue;
   }
   else
   {
       $traitable = true;
       $res_write = fwrite ($logconnectpt, "\r\nfichier uploadé, début du traitement de la vidéo\r\n");
   }
}//if ()

//===================================
//Phase de traitement de la vidéo
//===================================
if ($traitable&&$is_ext_ok)
{
   $res_write = fwrite ($logconnectpt, "\r\ndebut du traitement de la vidéo\r\n");
   $mod=chmod ($destination, 0770);

   //vérification, si le son doit être inclu
   if ($_POST['son1'] == 1)
   {
      $res_write = fwrite ($logconnectpt, "\r\nson sélectionné\r\n");
      $commande = "$path_ffmpeg -y -i $destination -t 00:00:40 -vcodec flv -s 350x250 -acodec mp3 ./film_flv/".$nom_final.".flv";
   }
   else
   {
       $res_write = fwrite ($logconnectpt, "son non sélectionné\r\n");
       $commande = "./ffmpeg/ffmpeg -y -i $destination -t 00:00:40 -f flv -an -vcodec flv -s 350x250 ./film_flv/".$nom_final.".flv";
   }//else

   $res = system ($commande, $res_var);
   $res_write = fwrite ($logconnectpt, "\r\ncommande à executer : $commande \r\n\r\n");

   if ($res_var == 0)
   {
      $res_write = fwrite ($logconnectpt, "\r\nla vidéo $nom_fic a bien été traitée\r\ndébut de la suppression de la vidéo uploadée\r\n");
      $bool = unlink ($destination);
      if ($bool)
      {
         $res_write = fwrite ($logconnectpt, "\r\n$destination supprimée avec succés\r\n");
      }//if ()
      else
      {
          $res_write = fwrite ($logerrorpt, "\r\n$destination non supprimée\r\n");
      }//else
   }//if ()
   else
   {
       $res_write = fwrite ($logerrorpt, "\r\nerreur lors de l'encodage... vidéo $destination non supprimée\r\n");
       exit;
   }//else

   $bool = unlink($nomlogerror);
   if ($bool)
   {
      $res_write = fwrite ($logconnectpt, "\r\nle fichier $nomlogerror a été supprimé avec succès\r\n");
   }//if ()
}//if ()

}//for

?>

Conclusion :


bon voila, une ptite mise a jour, le code est mieux structuré et j'ai ajouté la gestion des journaux de connections et d'erreur pour une application serveur (ce qui sera le cas au final.

EDIT :

J'ai rajouté dans le zip le code (refait), plus les 2 formulaires.
La nouvelle version du code permet l'envoi de plusieurs vidéos a la fois... enfin c'est seulement une fonctionnalité donc j'avais besoin...

Dans mon cas, il me reste malheureusement un unique problème, il est apparement impossible d'avoir du son dans le flv final lorsque la vidéo uploadée est au format mpg...
je vais peut etre trouver une solution (après des heures de bidouillages en tout genre) mais ca risque d'allourdir un peu le code et le temps de traitement.. m'enfin au moins il sera complet comme ca ..

voila merci

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
mardi 13 mars 2007
Statut
Membre
Dernière intervention
20 juillet 2010

Re
Bon j'apporte des lumières si elles peuvent être utile.
Donc la commande systeme na l'aire de fonctionné qu'avec des .exe dans le même dossier que se trouve le fichier dans lequel fout executé system. Donc
Test_upload.php-
ffmpeg.exe_|
tmp2(dossier)_|
flv_film(dossier)_|

dans le code il faut donc modifier la variable path_ffmpeg et dans commande mettre "ffmpeg.exe ..." au lieu de "./ffmmpeg/ffmpeg"
Une fois ces étapes faites aucuns problème ne devrait etre trouvée mis à part lors de la supression ou de la réupload de la même vidéo.
Pour cela il faut bien sur faire des controle sur le nom vidéo et modifier en conséquence quand à la supression voire du coté des droits utilisateurs.
Messages postés
2
Date d'inscription
mardi 13 mars 2007
Statut
Membre
Dernière intervention
20 juillet 2010

Salut tous le monde,
Merci pour ce taf car il n'existe pas beaucoups d'exemple d'utilisation de ffmpeg et de php
bon ba comme tout le monde je galère!
bon alors pour les erreurs "Notice: Undefined index: fichier1" vous avez mal lancer votre formulaire (par exemple chargé la page html dans votre navigateur directement et non par votre server) pour moi c'était le cas.
Ensuite j'ai eu aussi "Warning: fwrite(): supplied argument is not a valid" vous devez créez plusieurs dossier à l'endroit du test_upload.php nommé : "log" "tmp2" "film_flv"
Ensuite je suis bloqué, l'execution de la commande system ne fonctionne pas chez moi. Je pense fortement que mon installation de ffmpeg n'est pas complète. c'est pourquoi Yaug il aurait était cool que tu nous mettes un petit descriptif de l'install de ffmpeg.
Pour ma part de ce que j'ai vus sur le net :
Plusieurs versions de ffmpeg :
en open source et l'officiel ce sont les sources non compilées et beaucoups de fichiers incompréhensibles. Impossibles de trouvés un tuto pour compilé sous windows ou cygwin. A précisé qu'aucune dll n'est fournies dans le pack.
Des versions précompilées avec plus ou moin de dll et un .exe
Certaines personnes parle d'ajouté les codecs au servers, oui je veux bien faut il encore me dire comment? et comment savoir si on ne les possède pas déjà?
Ensuite certains parle d'activer une extension sous php pour utiliser directement ffmpeg comme une classe, cette méthode n'a donné aucuns résultats pour ma part, je n'arrive même pas à charger l'extension.
SI QUELQU'UN CONNAIT UN BON TUTO JE SUIS PRENEUR!
Messages postés
4
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
14 février 2010

Salut, tout d'abord superbe travail! Et merci beaucoup pour le partage !
Je lis dans le formulaire que la vidéo ne doit pas faire plus de 2 minutes...peut-on augmenter cette limite ? Je ne trouve pas ce paramètre dans ton code...ça viens de FFMPEG ?

Merci
Messages postés
90
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
22 septembre 2009

Bonjour,

J'essais d'installer FFMPEG depuis plus d'une semaine... J'ai cherché partout sur google, et rien de ce que j'ai trouvé n'a fonctionné. J'ai un server/passerelle avec SME SERVER qui tourne.
Je suis débutant et je comprends pas encore tout.
L'idée, si j'ai bien compris c'est de copier la library dans un dossier sur le server ? Mais lequel ? Et j'ai trouvé plusieurs versions de FFMPEG laquelle est ce que je dois utiliser ? J'ai trouvé plein de lignes de commande sur le net, mais rien n'a fonctionner... Quelqu'un peut m'aider ?

Merci à tous !
Messages postés
35
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
3 septembre 2010

Je viens de créer une classe beaucoup plus pratique que cette source datant de mes début.
Pour la voir c'est ici : http://www.phpcs.com/codes/CLASSE-FFMPEG-GESTION-VIDEOS_45279.aspx
Afficher les 35 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.