Я пытаюсь запустить FFMPEG ( библиотека Windows ) для видео, чтобы создать для него миниатюру. Команды отлично запускаются из команды propmpt, но не работают из PHP. Я дважды проверил свои разрешения, и у пользователя IIS есть полный доступ к каталогу. Кроме того, is_executable()
возвращает true в файле. Я уверен, что это не проблема с разрешениями.
Я так же сильно чувствую, что это, вероятно, выход из ситуации, и мне трудно найти здесь правильную комбинацию.
когда я пытался сделать $test = system ($cmd, $returnVal);
и повторить $test
, оно было пустым (false?).
Я что-то упустил?
PHP-код с тремя различными способами выполнения команды
$ffmpeg = dirname(__FILE__) .'\files\video\ffmpeg.exe';
echo "<strong>ffmpeg location:</strong> ".$ffmpeg.'<br /><br />';
if (file_exists($ffmpeg)) echo "file_exists() = true<br /><br />";
if (is_executable($ffmpeg)) echo "is_executable() = true<br /><br />";
//Attempt 1
$cmd = "$ffmpeg -i $video -deinterlace -an -ss $second -t 00:00:16 -r 1 -y -vcodec mjpeg -f mjpeg $image 2>&1";
echo "<strong>Executing</strong>: ".$cmd."<br /><br />";
system ($cmd, $returnValue);
echo "Return Value: $returnValue<br/><hr /><br />";
//Attempt 2
$cmd2= escapeshellcmd($cmd);
echo "<strong>Executing</strong>: ".$cmd2."<br /><br />";
system ($cmd2, $returnValue);
echo "Return Value: $returnValue<br/><hr /><br />";
//Attempt 3
$cmd3 = str_replace('\\',"\\\\",escapeshellarg($ffmpeg)." -i ".escapeshellarg($video)." -deinterlace -an -ss $second -t 00:00:16 -r 1 -y -vcodec mjpeg -f mjpeg ".escapeshellarg($image)." 2>&1");
echo "<strong>Executing</strong>: ".$cmd3."<br /><br />";
system ($cmd3, $returnValue);
echo "Return Value: $returnValue<br/><hr /><br />";
RESUTLS (все результаты в -1)
ffmpeg location: C:\www\alphacom\files\video\ffmpeg.exe
file_exists() = true
is_executable() = true
Executing: C:\www\alphacom\files\video\ffmpeg.exe -i C:\www\alphacom\files\video\test_video_ae.avi -deinterlace -an -ss 1 -t 00:00:16 -r 1 -y -vcodec mjpeg -f mjpeg C:\www\alphacom\files\video\test_video_ae.jpg 2>&1
Return Value: -1
Executing: C:^\www^\alphacom^\files^\video^\ffmpeg.exe -i C:^\www^\alphacom^\files^\video^\test_video_ae.avi -deinterlace -an -ss 1 -t 00:00:16 -r 1 -y -vcodec mjpeg -f mjpeg C:^\www^\alphacom^\files^\video^\test_video_ae.jpg 2^>^&1
Return Value: -1
Executing: "C:\\www\alphacom\\files\\video\\ffmpeg.exe" -i "C:\\www\\alphacom\\files\\video\\test_video_ae.avi" -deinterlace -an -ss 1 -t 00:00:16 -r 1 -y -vcodec mjpeg -f mjpeg "C:\\www\\alphacom\\files\\video\\test_video_ae.jpg" 2>&1
Return Value: -1
Executing: \"C:\\www\\alphacom\\files\\video\\ffmpeg.exe\" -i \"C:\\www\\alphacom\\files\\video\\test_video_ae.avi\" -deinterlace -an -ss 1 -t 00:00:16 -r 1 -y -vcodec mjpeg -f mjpeg \"C:\\www\\alphacom\\files\\video\\test_video_ae.jpg\" 2>&1
Return Value: -1
ОБНОВЛЕННЫЙ КОД ОТЛАДКИ
$cmd = "$ffmpeg -i $video -deinterlace -an -ss $second -t 00:00:16 -r 1 -y -vcodec mjpeg -f mjpeg $image 2>&1";
echo "<strong>Executing</strong>: ".$cmd."<br /><br />";
$test = system($cmd, $returnValue);
echo "Return Value: $returnValue<br/><hr /><br />";
var_dump($test);
$test
выход NULL