2010-12-09 134 views
1

我正面臨一個奇怪的問題。 我正在使用FFmpeg-PHP創建一些視頻的縮略圖,這些縮略圖使用gdlib粘貼到較大的預覽圖片中。 到目前爲止一切正常。 我正在做一個循環中的所有,所以ffmpeg-php必須製作10到20個不同視頻的預覽圖片。現在的問題是,如果我的腳本執行了第一個預覽圖像,它不會釋放使用的資源,所以我在第5個視頻後內存不足。RAM-Problem使用FFmpeg-PHP

現在的問題是:爲什麼?我摧毀和取消所有資源處理程序,等等...

下面是腳本:

<?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); 
    } 
} 


?> 

希望有人能幫助,它看起來有點討厭,因爲我加了一些額外的未設置狀態。

下面是函數調用:

 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); 
} 

這個片段在換每個循環運行。

PS:我已經張貼在這裏螺紋:http://ubuntuforums.org/showthread.php?p=10211381這裏:forums.devnetwork.net/viewtopic.php?f=1 & T = 125566 我希望你是不是我太生氣,但它是相當。重要:(

+0

現在沒有多少時間去研究它,我最初的猜測是某些引用沒有被解除引用,因此一些引用不會真正清理內存。你可以在前後使用`memory_get_usage`來確認。如果你不使用PHP 5.3,它在垃圾收集內存方面要好得多 - 嘗試一下。 – Fanis 2010-12-09 23:00:39

回答

0

謝謝你的提示我做到了,這就是結果:

[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 

它看起來相當多的其他影片一樣它總是可以追溯到:748936.我用:memory_get_usage (); 以下是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 

所以我想一切都在這裏很好,這是因爲:

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

所以這是幾乎相同的內存使用,一切解封后。

但 「的ps aux」 告訴我:

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

它開始於1.2和每一張照片後增加。 (37.9是以%表示的內存使用量)

發生了什麼事?