Encodage et traitement de automatique de vidéos en upload


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

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.