RAM-проблема с использованием FFmpeg-PHP - PullRequest
2 голосов
/ 09 декабря 2010

У меня странная проблема. Я использую FFmpeg-PHP для создания миниатюр некоторых видео, эти большие пальцы я вставляю в увеличенное изображение предварительного просмотра, используя gdlib. Это далеко все работает отлично. Я делаю все это в цикле, поэтому ffmpeg-php должен сделать от 10 до 20 предварительных изображений различных видео. Проблема теперь в том, что если мой скрипт выполнил первый предварительный просмотр, он не освобождает использованные ресурсы, поэтому после 5-го видео у меня заканчивается память.

Вопрос теперь: почему? Я уничтожил и сбросил все ресурсы-обработчики и так далее ...

Вот сценарий:

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

этот фрагмент работает в цикле for-each.

PS: я уже разместил эту ветку здесь: http://ubuntuforums.org/showthread.php?p=10211381 и здесь: forums.devnetwork.net/viewtopic.php?f=1&t=125566 Я надеюсь, что ты не слишком зол на меня, но это очень важно: (

1 Ответ

0 голосов
/ 10 декабря 2010

спасибо за совет.Я сделал это, и вот результат:

[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

Так что это почти то же самое Использование памяти, послеunsetting all.

Но «ps aux» говорит мне:

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

Начинается с 1.2 и увеличивается после каждой картинки.(37,9 - это использование памяти в%)

Что происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...