PHP exec()无法与ffmpeg配合使用

5
我将尝试在Ubuntu上使用PHP运行以下命令:
<?php
 if (exec("/home/johnboy/ffmpeg/ffmpeg -i test1.mp4 -acodec aac -ab 128kb -vcodec mpeg4 -b 1220kb -mbd 1 -s 320x180 final_video.mov")) 
      { echo "Success"; }
      else { echo "No good"; }

每次我都得到“无效”的回应,并且没有文件被创建。

有趣的是,如果我在Shell中运行完全相同的命令,它可以正常工作,没有问题。

此外,当我运行上面相同的代码,但将“whoami”替换为ffmpeg内容时,它可以正常工作。(它会回显“成功”)

你们有什么想法,为什么这不起作用呢?谢谢。


解决了。显然,目录可读但不可写。因此,FFmpeg无法创建新文件。我创建了另一个输出目录并将其chmod为777,问题迎刃而解! - Dodinas
8个回答

5
获取stderr将会得到结果
尝试
ffmpeg -i inputfile [more_params] 2>&1

3

Apache/Web用户可以访问/home/johnboy/ffmpeg/ffmpeg吗?可能/home/johnboy的权限是0700而不是0755?

也许有资源限制影响加载如此大的程序及其所有库吗?

如果您在php cli sapi中运行脚本,它是否表现正确?即使以apache用户身份运行?

strace -ff显示apache Web用户通过php cli运行php脚本时有什么情况?


感谢您的回复。我确认了ffmpeg和johnboy都被chmod为755。此外,我从shell中运行了php test.php命令,它可以正常工作。所以我知道这个脚本是有效的。只是无法从Web浏览器中运行。我不确定strace -ff是什么,或者我需要在哪里运行它? - Dodinas
@Dodinas:你可以输入 strace -ff php file.php > log.txt 2>&1 命令并上传日志文件(在仔细查看后)。此外,如果从 Apache 运行时 PHP 处于安全模式,则脚本可能无法运行;请检查您的 Apache 错误日志。 - geocar
1
@Dodinas:Apache是否对/var/www目录具有写访问权限? - geocar

2
使用这个
$ffmpeg = "ffmpeg Installed path";
$flvfile = "source video file with root path";
$png_path " "Destination video file with root path and file type";


exec("$ffmpeg -y -i $flvfile -vframes 1 -ss 00:01:60 
     -an -vcodec png -f rawvideo -s 110x90 $png_path");

1

你在使用相对路径来引用文件名,你确定正在正确的目录下执行命令吗?


是的,因为在shell中,我进入/var/www目录(php文件所在的位置)并在那里执行命令。结果,它成功地在目录/var/www/中创建了final_video.mov。 - Dodinas

1

如果您想以这种方式执行某些操作,可能会出现一些问题。
1. 可能存在权限问题,Web服务器有限制处理系统的某些执行。
2. 可能您的路径文件不正确。
3. 您可以尝试使用shell_exec执行系统执行。

无论如何,为了使我的执行顺利进行,我会编写两个程序,并在它们之间包含消息传递,例如客户端服务器程序。 服务器将等待来自客户端的某些消息以执行某些命令(所有命令都不会有权限问题)。您在Web中要做的就是调用您的客户端应用程序。

我强调的是从Web和系统构建一些接口。它将解决许多权限问题。

希望这可以帮助到您。


0

函数exec()只返回输出的最后一行,我怀疑该命令的最后一行为空。如果您想要命令的全部内容,应该使用shell_exec()。

同时要跟踪命令执行的位置,请尝试:print(shell_exec("pwd"));


有趣,我从exec获取了一个数组。 - keji

0

启用安全模式,它就会工作


0
$output = shell_exec('/home/person/www/ffmpeg 2>&1');
echo "<pre>$output</pre>";

请注意2>&1部分...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接