Я пытаюсь конвертировать видео в MP4 с помощью FFMPEG. У меня настроено так:
.
.
private $ffmpegPath;
public function __construct($con) {
$this->con = $con;
$this->ffmpegPath = realpath("ffmpeg/bin/ffmpeg.exe");
}
.
.
public function convertVideoToMp4($tempFilePath, $finalFilePath){
$cmd = "$this->ffmpegPath -i $tempFilePath $finalFilePath 2>&1";
$outputLog = array();
exec($cmd, $outputLog, $returnCode);
if ($returnCode != 0){
foreach ($outputLog as $line){
echo $line."<br>";
return false;
}
}
return true;
}
И в браузере я получаю следующую ошибку: «C:\xampp\htdocs\Thinksmart First Sprint» не распознается как внутренняя или внешняя команда».
В моем конструкторе я настроил его, чтобы дать мне реальный путь, и я подозреваю, что это то, что он делает в командной строке:
C:/xampp/htdocs/Thinksmart FIrst Sprint/ffmpeg/bin/ffmpeg.exe -i (имя временного файла) (имя файла, которое я хочу)
И это должно работать, но я не знаю, почему это не будет. Любые идеи? Это мой первый опыт работы с конвертацией видео.
@tim Насколько я знаю, realpath() вернет корневой каталог файла. Например, даже если ваш файл находится на рабочем столе, он будет называться C:/users/username/desktop/filename. Так что в моем случае он уже будет говорить C:/xampp/htdocs/Thinksmart First Sprint/ffmpeg/bin/ffmpeg.exe, но части лестницы 3 не появляются в строке
Цитата: $cmd = '"'.$this->ffmpegPath.'" -i $tempFilePath $finalFilePath 2>&1'; Я думаю, что в Windows работают только двойные кавычки. Вам нужно указать $tempFilePath $finalFilePath, если в них также могут быть пробелы.
Затем он говорит: "".$this->ffmpegPath"' не распознается как внутренняя или внешняя команда, я клянусь, что сделал с этим языком...
Я добавил кавычки вокруг него с комбинацией «и», и он все равно выдает ошибку.
Переменные не раскрываются в одинарных кавычках, поэтому вам нужно их переключать и объединять с помощью .. Попробуйте тот, что в ответе.






Как видите, пробелы в вашей команде используются для разделения аргументов. Поэтому, если в пути есть пробелы, вам нужно заключить весь путь в кавычки, чтобы оболочка/процессор знал, что они не являются разделителями, а являются одним аргументом:
$cmd = $cmd = '"' . $this->ffmpegPath . '" -i $tempFilePath $finalFilePath 2>&1';
Что приведет к примерно такой команде:
"C:/xampp/htdocs/Thinksmart First Sprint/ffmpeg/bin/ffmpeg.exe" -i C:/path/to/file1 C:/path/to/file2 2>&1
Я думаю, что в Windows работают только двойные кавычки. Вам нужно указать $tempFilePath и $finalFilePath, если в них также могут быть пробелы.
Так что я не должен использовать реальный путь? Если я разверну это веб-приложение, то я зайду на сервер и настрою путь к файлу для каждого сервера, на котором я его разверну? Что, если я использую серверы Linux? Я не хочу показаться грубым, просто хочу спросить, хоть это и звучит грубо. Буквально только любопытство. Как я уже сказал, я новичок во всем преобразовании видео, и я редко использую эти команды exec() в глобальной области (за пределами корневого каталога приложения).
Я ничего не говорил о неиспользовании realpath. $thi->ffmpegPath в ответе от вашего $this->ffmpegPath = realpath("ffmpeg/bin/ffmpeg.exe");
когда у вас есть пробелы в пути\каталоге, вам нужно указать его в кавычках