2014-05-05 7 views
1

J'ai un système de téléchargement de fichiers qui vérifie le format de fichier, etc. et convertit en mp4 si nécessaire. Cela fonctionne correctement tant que la longueur totale du fichier vidéo est inférieure à 30 secondes. J'ai testé ces deux courts clips environ 10 secondes chacun et ça marche très bien mais quand je teste cela avec un clip que cette 33 secondes, je reçois l'erreur:La conversion du fichier FFmpeg dépasse le temps d'exécution maximum

Erreur fatale: temps d'exécution maximum de 30 secondes dépassé dans C: \ xampp \ htdocs \ own_it_all \ global.func \ file_upload.php en ligne

je pouvais augmenter le temps d'exécution maximal dans le fi php.ini le mais comme la longueur maximale d'une vidéo est de 20 minutes, cela ne semble pas très convivial, ce qui fait que l'utilisateur attend 20 minutes par vidéo. Existe-t-il un moyen de convertir la vidéo instantanément ou aussi près que possible?

C'est le exec cmd i ont:

$cmd = "ffmpeg -i $input -vcodec h264 -acodec aac -strict -2 $o"; 

Comme le haut-chargeur permet le téléchargement de multiples c'est à l'intérieur d'une boucle.

foreach($_FILES['file']['name'] as $key => $name){ 
     if($_FILES['file']['error'][$key] === 0){ 
      $temp = $_FILES['file']['tmp_name'][$key]; 
      $ext = explode('.',$name); 
      $ext = strtolower(end($ext)); 
      $_file = md5($temp).time(); 
      $file = $_file.'.'.$ext; 
      if(in_array($ext,$allowed) === true && move_uploaded_file($temp,"../uploads/{$file}") === true){ 
       $file_type = explode('/',$_FILES['file']['type'][$key]); 
       if($file_type[0] === 'image'){ 
        $succedeed[] = array('name' => $name,'file' => $file, 'type' => 'image');    
       }else{ 
        $ffmpeg = 'ffmpeg'; 
        $output = dirname(__DIR__).'/uploads/thumbs/'.$_file.'.jpg'; 
        $input = dirname(__DIR__).'/uploads/'.$file; 
        $mov = new ffmpeg_movie($input); 
        $d = $mov->getDuration(); 
        $iscopy = $mov->getCopyright(); 
        $h = $mov->getFrameHeight(); 
        $w = $mov->getFrameWidth(); 
        $pos = ceil((int)$d /3); 
        $size = $w.'x'.$h; 
        $i = explode('.',$input); 
        $o = $i[0].'.mp4'; 
        if(ceil($d) < 1200){ 
         if($ext != 'mp4'){ 
          $cmd = "ffmpeg -i $input -vcodec h264 -acodec aac -strict -2 $o"; 
          //$cmd = "ffmpeg -i $input -vcodec h264 -acodec aac -s $size $o"; 
          shell_exec($cmd); 
          $toclear[] = array('file' => $file); 
         } 
         $cmd = "ffmpeg -ss $pos -i $o -an -s $size $output"; 
         shell_exec($cmd); 
         $total_time += $pos; 
         $succedeed[] = array('name' => $name,'file' => 'thumbs/'.$_file.'.jpg', 'type' => 'mp4');       

        }else{ 
         $failed[] = array('name' => $name, 'file' => $file, 'error' => 'Video length cannot exceed 20mins.'); 
        }   
       } 

      }else{ 
       $failed[] = array('name' => $name, 'file' => $file, 'error' => 'File type not allowed'); 
      } 
     } 
    } 

Répondre

1

Vérifiez votre adresse IP et définissez l'heure d'exécution maximale. Dans mon cas, 5 min de vidéo est plus de 30 min de conversion avec ffmpeg. Vous pouvez utiliser ajax pour appeler votre script php "convertisseur" et mettre un "loader" avec jscript.

+0

Semble mieux, si je comprends bien que vous voulez dire: 1. télécharger les fichiers - afficher la barre de progression en cours 2. convertir les fichiers - afficher la nouvelle barre de progression –

+0

Correct! Mais je pense qu'il est difficile de faire progresser ffmpeg ... Il vaut mieux montrer un message "loading ...". –

Questions connexes