ffmpeg работает на терминале не с PHP exec
Если я выполняю команду ffmpeg из терминала, я получаю желаемый результат:
ffmpeg -i src.mp4 -ar 22050 -ab 32 -f flv -s 320x240 video.flv
Вывод терминала
... видео:3404 КБ, аудио:1038 КБ, глобальные заголовки: 0 КБ, мультиплексирование 2.966904%
И video.flv создан правильно.
Затем, если вызывается через PHP exec:
exec("ffmpeg -i src.mp4 -ar 22050 -ab 32 -f flv -s 320x240 video.flv", $o, $v);
var_dump($o);
var_dump($v);
выход:
array (0) {} int (1)
И файл не создается.
Есть мысли о том, как подойти к этому?
Я могу exec('whoami')
без проблем.
Я также использовал полный путь ffmpeg: /usr/local/bin/ffmpeg
5 ответов
Да, проблема в том, что вы используете exec вместо shell_exec, дело в том, что среда exec не знает ни о каком исполняемом файле ffmpeg, а shell_exec, потому что он использует env. Баш / оболочки
Это решение использует полный путь к исполняемому файлу ffmpeg, например. / USR / бен / FFmpeg
Добавьте "2>&1" в конец команды, и она будет работать:
exec("ffmpeg -i src.mp4 -ar 22050 -ab 32 -f flv -s 320x240 video.flv 2>&1", $o, $v);
У меня та же проблема, сначала убедитесь, что ffmpeg.exe или каталог находится на пути к Windows, затем перезапустите сервер apache, чтобы php нашел команду ffmpeg. После этого я могу использовать ffmpeg с обоими параметрами exec и shell_exec
Помимо использования полного пути для
ffmpeg
, используйте
/full/path/to/src.mp4
и
/full/path/to/video.flv
В моем случае из-за использования пользователя root для создания папки у пользователя php не было разрешения на запись. Разрешение на запись сработало. По какой-то причине я не получил никакого вывода сshell_exec
но следующее показывает все и находитffmpeg
двоичные файлы для вас.
<?php
$dir = __DIR__;
//Find ffmpeg binaries
$ffmpeg =trim(shell_exec("which ffmpeg"));
//resize input.png to 120px width
$command = "$ffmpeg -i '$dir/input.png' -vf scale=120:-1 '$dir/output.png'";
echo $command . "<br>";
//run command and output streams to vars
exec("$command 2>&1", $o, $v);
echo "<pre>";
print_r($o);
print_r($v);
echo "</pre>";