FFMPEG работает в командной строке, но не в PHP

Я использую сборку ffmpeg для Windows, чтобы делать миниатюры видео. Команда хорошо работает в командной строке, но не в методе PHP exec. я использую PHP 5.2.11

Вот команда.

"E:/Documents and Settings/x/WINDOWS/ffmpeg" -itsoffset -4 -v "E:/Program Files/Apache Software Foundation/Apache2.2/htdocs/bs/files/videogal/c08c3d20eeb9083ed033577bd154cba6.flv" -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 "E:/Program Files/Apache Software Foundation/Apache2.2/htdocs/bs/files/gallery/8ff43b72b932d2a34e7a6733672ad4d6.jpg" 2>&1

Может кто-нибудь помочь. Я проверил разрешения, они кажутся прекрасными. ГД установлен.

Сообщение об ошибке: 'E:/Documents' is not recognized as an internal or external command, operable program or batch file

Я использую косую черту в своих путях, за исключением случаев, когда я избегаю двойных кавычек

PHP-функция

function ExtractThumb($in, $out)
{$path=dbconf::FFMPEG_PATH;
    $thumb_stdout;
    $errors;
    $retval = 0;
 echo $in;
    // Delete the file if it already exists
    if (file_exists($out)) { unlink($out); }

    // Use ffmpeg to generate a thumbnail from the movie
    $cmd = "$path -itsoffset -4 -i $in -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 $out 2>&1";
   echo $cmd;

   exec($cmd, $thumb_stdout, $retval);

    // Queue up the error for processing
    if ($retval != 0) { $errors[] = "FFMPEG thumbnail generation failed"; }

    if (!empty($thumb_stdout))
    {
        foreach ($thumb_stdout as $line)
        {
            echo $line . "\n";
        }
    }

    if (!empty($errors))
    {
        foreach ($errors as $error)
        {
            echo $error . "\n";
        }
    }
}

достаточно забавно, если я запускаю без абсолютного пути $in и $out, вот что я получаю

Copyright (c) 2000-2009 Fabrice Bellard, et al. configuration: --extra-cflags=-fno-common --enable-memalign-hack --enable-pthreads --enable-libmp3lame --enable-libxvid --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libfaac --enable-libgsm --enable-libx264 --enable-libschroedinger --enable-avisynth --enable-swscale --enable-gpl libavutil 49.12. 0 / 49.12. 0 libavcodec 52.10. 0 / 52.10. 0 libavformat 52.23. 1 / 52.23. 1 libavdevice 52. 1. 0 / 52. 1. 0 libswscale 0. 6. 1 / 0. 6. 1 built on Jan 13 2009 02:57:09, gcc: 4.2.4 822ae86a93810dade2843e822390d723.flv: no such file or directory

person Freeman    schedule 24.03.2010    source источник
comment
покажите, как вы выполняете это с помощью PHP. Какое у вас сообщение об ошибке. Вы запускаете его против веб-сервера. Если да, можете ли вы заходить в E:\Documents and Settings ?и т.д. и т.д. Вы должны показать больше информации!   -  person ghostdog74    schedule 24.03.2010
comment
Я использую Windows XP, поэтому сомневаюсь, что есть проблемы с разрешениями.   -  person Freeman    schedule 24.03.2010


Ответы (6)


exec("\"E:\\Documents and Settings\\x\\WINDOWS\\ffmpeg\" -i <inputfile> <options> <outfile>");

Вот один из моих, которые я использовал в прошлом (при условии, что я нахожусь в стеке LAMP):

$cmd = "/usr/bin/ffmpeg -i ".$in." -y -an -sameq -vframes 1 -s 100x56 -ss 3 -t 0.001 ".$out;

Вы также можете рассмотреть: http://ffmpeg-php.sourceforge.net/

person B00MER    schedule 25.03.2010

Вам нужно правильно экранировать команду:

exec(escapeshellcmd($cmd), $thumb_stdout, $retval);

Также у вас включен безопасный режим PHP? Вы должны убедиться, что $in является реальным файлом, прежде чем пытаться кодировать.

person Giles Smith    schedule 30.03.2010
comment
+1 за включение безопасного режима. Он может применять ограничения open_basedir по умолчанию, исключающие команду exec для доступа к команде ffmpeg. - person Giuseppe; 28.02.2018

правильно ли вы избегаете обратной косой черты, кавычек и т. д.? Есть ли сообщение об ошибке?

person varzan    schedule 24.03.2010

В сообщении об ошибке говорится, что он не распознает его как команду. Скорее всего, это ваша цитата. Проверьте свое цитирование пробелов. При необходимости экранируйте пробелы, используя косую черту "\". И где ваш фрагмент кода, который вызывает exec()?

person ghostdog74    schedule 24.03.2010

Может быть, попробуйте это:

$cmd = "\"$path\" -itsoffset -4 -i \"$in\" -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 \"$out\" 2>&1";
person davr    schedule 25.03.2010

Я использую это так::

exec("C:/wamp/bin/ffmpeg -i ./output4.mp4 -sameq -acodec libmp3lame -ar 22050 -ab 32 -f flv -s 320x240 ./output8.flv -vcodec mjpeg -vframes 4 -an -f rawvideo -s 320x240 ./pic008.jpg 2>&1");

Прямое подключение с WAMP SERVER.

Обратите внимание на:

./output4.mp4

Это говорит PHP, что я имею дело с текущим каталогом.

--Всего наилучшего

person ErickBest    schedule 17.04.2013