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>";
Другие вопросы по тегам