如何通过PHP执行命令?

时间:2019-01-29 22:08:40

标签: php ffmpeg exec

我正在尝试使用FFMPEG将视频转换为MP4。我以这种方式设置它:

.
.
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冲刺/ffmpeg/bin/ffmpeg.exe -i(文件临时名称)(我想要的文件名称)

这应该工作,但是我不知道为什么不会。有任何想法吗?这是我第一次进行视频转换。

1 个答案:

答案 0 :(得分:1)

如您所见,命令中的空格用于分隔参数。因此,如果路径中有空格,则需要在整个路径上用引号引起来,以便外壳程序/处理器知道它们不是分隔符,而是一个参数:

$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