2010-12-09 27 views
1

Je suis confronté à un problème étrange. J'utilise FFmpeg-PHP pour créer des vignettes de certaines vidéos, ces pouces que je colle dans un plus grand aperçu de l'image, en utilisant gdlib. Jusqu'ici tout fonctionne bien. Je fais tout ça dans une boucle, donc ffmpeg-php doit faire 10 à 20 preview-images de vidéos différentes. Le problème est maintenant, si mon script a fait la première image d'aperçu, il ne libère pas les ressources utilisées, donc je manque de mémoire après la 5ème vidéo.RAM-Problème utilisant FFmpeg-PHP

La question maintenant est: Pourquoi? Je détruisais et Détruit toutes les ressources Handler, et ainsi de suite ...

Voici le script:

<?php 
error_reporting(E_ALL); 
$extension = "ffmpeg"; 
$extension_soname = $extension . "." . PHP_SHLIB_SUFFIX; 
$extension_fullname = PHP_EXTENSION_DIR . "/" . $extension_soname; 

// load extension 
if(!extension_loaded($extension)) { 
    dl($extension_soname) or die("Can't load extension $extension_fullname\n"); 
    echo "Load FFmpeg-php!\n"; 
} 

class VidPreview 
{ 
    private $pathToVid; 
    private $video; 
    private $preview; 
    private $previewX; 
    private $previewY; 

    public function __construct($pathToVid, $previewX, $previewY) 
    { 
     $this->pathToVid = $pathToVid; 
     $this->previewX = $previewX; 
     $this->previewY = $previewY; 
     $this->video = new ffmpeg_movie($this->pathToVid); 

     //init gd for main picture 
     $this->preview = imagecreate($this->previewX, $this->previewY); 
     imagecolorallocate($this->preview, 250, 250, 200); 
     imagestring($this->preview, 5, $this->previewX/2, 20, "Preview!", 5); 
    } 

    private function makeScreenshot($frame) 
    { 
     $ff_frame = $this->video->getFrame($frame); 
     if(method_exists($ff_frame, 'toGDImage')) 
     { 
      $screenshot = $ff_frame->toGDImage(); 
     } 
     else 
     { 
      $screenshot = false; 
     } 
     unset($ff_frame); 
     return $screenshot; 
    } 

    public function makePreview($pathToSave, $amountOfShots) 
    { 
     //get video-frame-number 
     $frameNumber = $this->video->getFrameCount(); 
     $frameValue = round(($frameNumber/$amountOfShots))-1; 
     $frameValueStep = $frameValue; 

     $dst_x = 20; 
     $dst_y = 40; 
     while($frameNumber >= $frameValue) 
     { 
      $screenshot = $this->makeScreenshot($frameValue); 
      if($screenshot != false) 
      { 
       if($dst_x >= $this->previewX) 
       { 
        $dst_y = $dst_y + 20 + 135; 
        $dst_x = 20; 
       } 
       //copy screen to preview 
       imagecopyresized($this->preview, $screenshot , $dst_x, $dst_y , 0 , 0 , 240 , 135 , 720 , 406);//TODO FIX VID VALUES 
       imagedestroy($screenshot); 
       unset($screenshot); 
       //TODO FIX PREVIEW BUG 
       $dst_x = $dst_x + 240 + 20; 
       $frameValue = $frameValue + $frameValueStep; 
       echo '$dst_x: '.$dst_x." ".'$dst_y: '.$dst_y.' '.'$frameNumber, $frameValue: '.$frameValue.','.$frameNumber."\n"; 
      } 
      else 
      { 
       fwrite(STDOUT, "FFmpeg-php messed up! I will just skip this screenshot... \n"); 
       unset($screenshot); 
       $frameValue = $frameValue + $frameValueStep; 
      } 
     } 

     if(!imagejpeg($this->preview, $pathToSave, 100)) 
     { 
      imagedestroy($this->preview); 
      unset($this->preview); 
      unset($this->video); 
      return false; 
     } 
     imagedestroy($this->preview); 
     unset($this->preview); 
     unset($this->video); 
     return true; 
    } 

    function __destruct() 
    { 
     unset($this->pathToVid); 
     unset($this->video); 
     unset($this->preview); 
     unset($this->previewX); 
     unset($this->previewY); 
    } 
} 


?> 

quelqu'un d'espoir peut aider, il semble un peu méchant, parce que j'ajouté quelques unset supplémentaires.

Voici l'appel de fonction:

 if(!file_exists($pathToPic.'/'.$dirName.".jpg")) 
    { 
     fwrite(STDOUT, "Making pictures of: ".$file." \n"); 
    $preview = new VidPreview($pathToVid,1000, 700); 
    $preview->makePreview($pathToPic.'/'.$dirName.".jpg", 16); 
    unset($preview); 
} 

cet extrait court dans une for-each boucle.

PS: J'ai déjà posté ce fil ici: http://ubuntuforums.org/showthread.php?p=10211381 et ici: forums.devnetwork.net/viewtopic.php?f=1 & t = 125566 J'espère que vous n'êtes pas trop en colère contre moi, mais il est assez . :(

importants
+0

N'ayant pas beaucoup de temps pour l'examiner en ce moment, ma première estimation est que certaines références ne sont pas déréférencées, donc certaines mises à jour ne libèrent pas vraiment la mémoire. Vous pouvez confirmer en utilisant 'memory_get_usage' avant et après. Si vous n'utilisez pas PHP 5.3, c'est beaucoup mieux à la mémoire de collecte des ordures - essayez-le. – Fanis

+0

J'ai essayé et je vais envoyer le résultat – user536696

Répondre

0

Merci pour le conseil je l'ai fait et c'est le résultat:.

[Start] Function: __construct (Before doing anything). Used Memory: 749240 
[wmv3 @ 0xaf8e9d0] Extra data: 8 bits left, value: 0 
Function: __construct (After making stuff). Used Memory: 2191352 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191808 
Function: makeScreenshot (start). Used Memory: 2191808 
[wmv3 @ 0xaf8e9d0] Extra data: 8 bits left, value: 0 
Function: makeScreenshot (end). Used Memory: 3680464 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191808 
$dst_x: 280 $dst_y: 40 $frameNumber, $frameValue: 12230,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 540 $dst_y: 40 $frameNumber, $frameValue: 18345,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 800 $dst_y: 40 $frameNumber, $frameValue: 24460,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 1060 $dst_y: 40 $frameNumber, $frameValue: 30575,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 280 $dst_y: 195 $frameNumber, $frameValue: 36690,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 800 $dst_y: 195 $frameNumber, $frameValue: 48920,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 1060 $dst_y: 195 $frameNumber, $frameValue: 55035,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 280 $dst_y: 350 $frameNumber, $frameValue: 61150,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 540 $dst_y: 350 $frameNumber, $frameValue: 67265,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 800 $dst_y: 350 $frameNumber, $frameValue: 73380,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 1060 $dst_y: 350 $frameNumber, $frameValue: 79495,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 280 $dst_y: 505 $frameNumber, $frameValue: 85610,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 540 $dst_y: 505 $frameNumber, $frameValue: 91725,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 800 $dst_y: 505 $frameNumber, $frameValue: 97840,97851 
Function: makePreview (before calling makeScreenshot). Used Memory: 2191856 
Function: makeScreenshot (start). Used Memory: 2191856 
Function: makeScreenshot (end). Used Memory: 3680512 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2191856 
$dst_x: 1060 $dst_y: 505 $frameNumber, $frameValue: 103955,97851 
[END] Function: makePreview (After unsetting everything). Used Memory: 749728 
[REAL-END] Function: __destruct (After unsetting really everything). Used Memory: 748936 

il semble à peu près la même chose pour les autres vidéos il va toujours à: 748936. J'utilisé: memory_get_usage(); Voici les résultats pour memory_get_usage (true):

[Start] Function: __construct (Before doing anything). Used Memory: 1835008 
[wmv3 @ 0x19c08dc0] Extra data: 8 bits left, value: 0 
Function: __construct (After making stuff). Used Memory: 2359296 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
[wmv3 @ 0x19c08dc0] Extra data: 8 bits left, value: 0 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 280 $dst_y: 40 $frameNumber, $frameValue: 13082,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 540 $dst_y: 40 $frameNumber, $frameValue: 19623,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 800 $dst_y: 40 $frameNumber, $frameValue: 26164,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 1060 $dst_y: 40 $frameNumber, $frameValue: 32705,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 280 $dst_y: 195 $frameNumber, $frameValue: 39246,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 540 $dst_y: 195 $frameNumber, $frameValue: 45787,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 800 $dst_y: 195 $frameNumber, $frameValue: 52328,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 1060 $dst_y: 195 $frameNumber, $frameValue: 58869,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 280 $dst_y: 350 $frameNumber, $frameValue: 65410,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 540 $dst_y: 350 $frameNumber, $frameValue: 71951,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 800 $dst_y: 350 $frameNumber, $frameValue: 78492,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 1060 $dst_y: 350 $frameNumber, $frameValue: 85033,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 280 $dst_y: 505 $frameNumber, $frameValue: 91574,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 540 $dst_y: 505 $frameNumber, $frameValue: 98115,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 3932160 
Function: makePreview (After unseting $screenshot of makeScreenshot). Used Memory: 2359296 
$dst_x: 800 $dst_y: 505 $frameNumber, $frameValue: 104656,104670 
Function: makePreview (before calling makeScreenshot). Used Memory: 2359296 
Function: makeScreenshot (start). Used Memory: 2359296 
Function: makeScreenshot (end). Used Memory: 2359296 
FFmpeg-php messed up! I will just skip this screenshot... 
FFmpeg-php messed up! I will just skip this screenshot... 
Function: makePreview (After unseting $screenshot of makeScreenshot (case of failure)). Used Memory: 2359296 
[END] Function: makePreview (After unsetting everything). Used Memory: 1835008 
[REAL-END] Function: __destruct (After unsetting really everything). Used Memory: 1835008 

donc je suppose que tout est bien ici, parce que:

[Start] Function: __construct (Before doing anything). Used Memory: 749240 
[REAL-END] Function: __destruct (After unsetting really everything). Used Memory: 748936 

Il est à peu près la même mémoire-utilisation, tout MHS après.

Mais "ps aux" me dit:

root  21637 37.0 **37.9** 303952 198744 pts/1 R+ 11:48 20:27 php upload.php 

Il commence à 1,2 et augmente après chaque image. (37.9 est l'utilisation de la mémoire en%)

Que se passe-t-il?