我通过 PHP 的 exec()
命令在 MAMP 中的 Mac OSX 10.7.3 上使用 ffmpeg,我有一个绝对路径设置为调用 ffmpeg,例如
/opt/local/bin/ffmpeg -i "/sample.avi"
但是我收到以下错误-
dyld: Library not loaded: /opt/local/lib/libjpeg.8.dylib Referenced from: /opt/local/lib/libopenjpeg.1.dylib Reason: Incompatible library version: libopenjpeg.1.dylib requires version 13.0.0 or later, but libJPEG.dylib provides version 12.0.0
注意:ffmpeg是通过Macports安装的。
它从命令行工作。
怎么办?
编辑
我已经重新打开了这个 - 最初认为shell_exec()
解决了这个问题,但实际上它应该有不同的称呼 - 直到今天进一步调查我才意识到。这是我使用 shell_exec 的代码,但仍然给出上面的错误:
$cmd = '/opt/local/bin/ffmpeg -h';
$cmd = escapeshellcmd($cmd) . ' 2>&1';
$output = shell_exec($cmd);
var_dump($output);
问题是DYLD_LIBRARY_PATH是在 MAMP 中设置的,我已经通过 macports 安装了 ffmpeg。
这可能不是最好的解决方案,但它现在让我启动并运行:
在/Applications/MAMP/Library/bin/envvars
文件中,注释以下行,如下所示:
#DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
#export DYLD_LIBRARY_PATH
并重新启动 Apache
掉该行#DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
短期内有效,但它可能会破坏其他事情,因为您要删除 MAMP 用来告诉服务器将其库保存在哪里的行。
更好的解决方案是将行更改为:
DYLD_LIBRARY_PATH="/usr/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
这样你只是在已经给定的路径前面/usr/local/lib:
。这告诉 Apache 先查看/usr/local/lib
,然后如果这不起作用,则查看/Applications/MAMP/Library/lib
。
因此,如果您通过 Brew 安装某些内容并且有两个版本,它将首先查看您随 Brew 安装的版本,然后再使用 MAMP 附带的任何内容,这更有可能过时。但是,如果它是仅随 MAMP 附带的东西,您没有单独安装或特定于 MAMP,则不会破坏它。
当你使用命令行时,确保 PHP 的exec
使用与你相同的 shell。
可能shell_exec
文档有帮助。
另请参阅php shell_Exec命令在shell中工作时不起作用。