【问题标题】:PHP exec() Not Working With ffmpegPHP exec() 不适用于 ffmpeg
【发布时间】:2010-03-09 19:37:34
【问题描述】:

我正在尝试在 PHP(在 Ubuntu 上)中运行以下命令:

<?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,瞧!

标签: php ffmpeg exec


【解决方案1】:

获取stderr会给出结果

试试

ffmpeg -i inputfile [more_params] 2>&1

【讨论】:

    【解决方案2】:

    apache/web 用户能否联系到/home/johnboy/ffmpeg/ffmpeg?也就是说,/home/johnboy 可能是 0700 而不是 0755?

    可能存在影响加载如此大的程序及其所有库的资源限制?

    如果您将脚本运行到 php cli sapi,它的行为是否正确?即使以 apache 用户身份运行?

    当 apache web 用户通过 php cli 运行 php 脚本时,strace -ff 会显示什么?

    【讨论】:

    • 感谢您的回复。我是否确保 ffmpeg 和 johnboy 是 755 的 chmod。另外,我从 shell 运行了 php test.php 命令,它运行良好。所以我知道脚本有效。它只是不会从网络浏览器运行。我不确定 strace -ff 是什么,或者我需要在哪里运行它?
    • @Dodinas :您将编写 strace -ff php file.php > log.txt 2>&1 并将该日志上传到某个地方(仔细查看后)另外,如果 php 在运行时处于安全模式来自 apache,脚本可能无法运行;检查你的 apache 错误日志。
    • @Dodinas : apache 对 /var/www 目录有写权限吗?
    【解决方案3】:

    您正在使用文件名的相对路径。你确定你在正确的目录中执行命令吗?

    【讨论】:

    • 是的,因为在 shell 中,我 cd 到 /var/www(php 文件的位置)并在那里执行命令。结果,它成功地在director /var/www/中创建了final_video.mov
    【解决方案4】:

    使用这个

    $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");
    

    【讨论】:

      【解决方案5】:

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

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

      我强调的是从网络和系统构建一些界面。它会解决很多权限问题。

      希望对您有所帮助。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 有趣的是我从 exec 得到一个数组
        【解决方案7】:

        启用安全模式,它会工作

        【讨论】:

          【解决方案8】:
          $output = shell_exec('/home/person/www/ffmpeg 2>&1');
          echo "<pre>$output</pre>";
          

          注意 2>&1 部分...

          【讨论】:

            猜你喜欢
            • 2011-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-18
            相关资源
            最近更新 更多