【问题标题】:sh: ffmpeg: command not found when run command through phpsh:ffmpeg:通过php运行命令时找不到命令
【发布时间】:2015-06-14 07:00:51
【问题描述】:

我已经在我的 Centos 6 机器 (https://trac.ffmpeg.org/wiki/CompilationGuide/Centos) 的根目录上成功安装了 FFMpeg。

我的apache/php工作场所是/var/www/html

现在我在 /var/www/html 目录上成功运行以下命令以从视频文件中捕获帧。它正在捕获一个帧。

[root@localhost html]# ffmpeg -i video.mpg -an -ss 30  -t 00:00:01 -r 1 -y -vcodec mjpeg -f mjpeg -s 160x100 frame8  2>&1

我想通过 php 并使用 shell_exec() 或 exec() php 函数来运行这个命令。我运行命令的 php 代码是:

$cmd = "/root/bin/ffmpeg -i /project/app/webroot/videos/video.mpg -ss 00:00:14.435 -f image2 -vframes 1 /project/app/webroot/videothumbnails/example-thumb.jpg";
$locale = 'en_IN.UTF-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);
echo shell_exec($cmd);

当我尝试通过上面的 php 代码运行命令时,出现以下错误:

sh: ffmpeg: command not found

请帮我解决这个问题。

【问题讨论】:

  • 转到 putty 并运行命令 'whereis ffmpeg'。
  • 你知道你的 ffmpeg 位置到底在哪里。
  • @User 我运行命令'whereis ffmpeg',输出为ffmpeg:
  • 你能在centos命令行中运行上面的命令吗?看看发生了什么?有没有视频缩略图创建没有?
  • 我在很久以前遇到过同样的问题,我认为 ffmpeg 没有正确安装。

标签: php ffmpeg centos6


【解决方案1】:

我已经看到了这个问题。对我来说,“找不到命令”可能是 $PATH 变量问题。

当通过php运行此命令并使用shell_exec()exec() php函数时,您可以使用不同的$PATH变量与linux目录中的运行命令进行比较。

例如,我的php项目的/usr/local/php/etc/vhostphp-fpm.conf如下:

env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
env[LD_LIBRARY_PATH] = /usr/local/lib

ffmpeg 命令位于/data/bin 目录中。我的 Linux 的 $PATH 变量包含 /data/bin

所以在上面的env[PATH]变量中添加/data/bin就可以解决问题了。

【讨论】:

    【解决方案2】:

    我们使用 ffmpeg 创建视频缩略图。

    在Linux系统(centos 6.x) Ffmpeg安装过程及Php示例:-

    这个过程在我的centos 6中完成,并使用php创建了缩略图。

    第 1 步:-请检查您的 linux 服务器中是否有任何现有的 ffmpeg 可用。如果可用,请删除该文件。

    第 2 步:- 对于新的 ffmpeg 安装,请点击此链接
    http://root.uabid.com/compile-ffmpeg-on-centos-6-x/

    Step3:- 安装完成后检查你的 ffmpeg 安装在哪里。

    命令:whereis ffmpeg

    在 linux 命令行中键入此命令并检查。例如,如果您的 ffmpeg 路径位于 (/usr/local/bin/ffmpeg)。 在您的代码中使用此路径。

    PHP 示例:-

    <?php
    
        if($extension === 'mp4' OR $extension == 'MP4' )
        {
        $video = $timestamp.$imagename;
        $videoname=substr($imagename,0, -4).$timestamp;
        $image = "sites/default/files/content_images/{$videoname}-thumb.jpg";
    
        var_dump($video);
    
        $cmd = "/usr/local/bin/ffmpeg -i    /opt/lampp/htdocs/myproject/sites/default/files/content_videos/".$video." -ss   00:00:01.435 -f image2 -vframes 1       /opt/lampp/htdocs/myproject/sites/default/files/content_images/".$videoname."-  thumb.jpg";
    
        $cmdstr = $cmd;
        $locale = 'en_IN.UTF-8';
        setlocale(LC_ALL, $locale);
        putenv('LC_ALL='.$locale);
        echo exec($cmd);
    ?>
    

    流程2:- 这是针对静态文件路径的:

    <?php    
        $cmd = "/root/bin/ffmpeg -i /var/www/html/project/app/webroot/videos/example.mp4 -ss   00:00:01.435 -f image2 -vframes 1 /var/www/html/project/app/webroot/videothumbnails/example-thumb.jpg";
        $cmdstr = $cmd;
        $locale = 'en_IN.UTF-8';
        setlocale(LC_ALL, $locale);
        putenv('LC_ALL='.$locale);
        echo exec($cmd);
    ?>
    

    希望这对您和其他人有所帮助..

    【讨论】:

    • 如果有任何问题,请尝试告诉我。
    • 非常感谢,但这段代码也没有生成缩略图。运行此代码时没有显示错误。我检查了整个目录,但没有生成缩略图 example-thumb.jpg。
    • 是否有任何地方有 ffmpeg...运行 whereis ffmpeg 并查看一次..如果任何其他 palces 有 ffmpeg 路径,如 usr/local/bin/ffmpeg
    • # whereis ffmpeg 命令输出为ffmpeg: # which ffmpeg 命令输出为/root/bin/ffmpeg
    • 尝试使用我的链接@Ashok 重新安装...这是最后一步...实际上默认路径是/usr/local/bin/ffmpeg。
    【解决方案3】:

    尝试使用which 定位 ffmpeg 二进制文件。至少在基于 Ubuntu/Debian 的 Linux 上,which 命令应该默认可用。 which 将文件路径返回到任何可用应用程序的首选可执行文件。例如。 which php 应该返回默认用于 CLI 操作的 PHP 安装可执行文件。因此which ffmpeg 应该返回 ffmpeg 安装的系统默认位置。

    <?php
    
    // shell_exec returns the command output or null on error/empty output.
    $ffmpeg_path = shell_exec('which ffmpeg');
    
    if ($ffmpeg_path != null) {
        shell_exec($ffmpeg_path . ' -i file.mpg --snip--');
    }
    

    还要确保运行 PHP 脚本的 Linux 用户可以访问 ffmpeg(例如 $ chmod +x ffmpeg)。如果 $ sudo which ffmpeg 返回路径但 $ which ffmpeg 没有返回,请尝试为所需用户重新安装 ffmpeg 或使用权限。

    编辑:尽管注意which,但不知道破解者是否可以用恶意软件替换 ffmpeg 可执行文件(这会导致上述 PHP 脚本运行错误的可执行文件)。

    【讨论】:

    • 当我尝试# which ffmpeg 时,我得到了/root/bin/ffmpeg。之后,我根据这个路径对命令进行了更改并通过php运行,我得到sh: /root/bin/ffmpeg: Permission denied错误。我也尝试通过# chmod o+x /root/bin/ffmpeg 设置权限,但没有运气
    • PHP 用户需要访问 ffmpeg 可执行文件。您能否尝试以非 root 用户身份从头开始构建 ffmpeg 应用程序并将执行权限分配给 www-data(或任何 PHP 运行进程用户)?
    • 在我的 MAC shell_exec( 'which ffmpeg' ) 上也使用了回车符...确保将其过滤掉: $ffmpeg_path = str_replace( "\n","", $ffmpeg_path );
    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2015-09-30
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2015-12-21
    相关资源
    最近更新 更多