【问题标题】:FFMPEG conversion using shell_exec timeout for large filesFFMPEG 转换使用 shell_exec 超时处理大文件
【发布时间】:2017-04-06 11:10:06
【问题描述】:

我正在尝试使用 ffmpeg 和 php 将一个大 (40mb) mov 文件转换为 mp4。

但它在服务器上给了我一个 504 超时错误。我可以在不更改set_time_limit 的情况下解决这个问题吗?

这是我的 php 代码。

shell_exec($this->getFFmpegPath() . ' -i ' . $path . ' -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -preset slower -crf 18 -vf "scale=trunc(in_w/2)*2:trunc(in_h/2)*2" ' . $convertedPath . '.mp4');

那么,关于如何在没有超时的情况下进行转换的任何想法?任何帮助将不胜感激。

【问题讨论】:

    标签: php ffmpeg shell-exec


    【解决方案1】:

    您可能希望在后台运行转换。我发现this question 解决了这个问题,但请对该主题进行更多调查。然后,您可以允许用户刷新以查看该过程是否已完成。

    它也可能提供更好的用户体验(比长时间查看页面加载更好。连接中有很多地方可能会决定将其视为超时:php引擎,网络服务器,代理,浏览器,取决于基础设施。

    您还应该真的小心shell_exec。网络上有人滥用它来对您的机器做任何他们想做的事情的可能性非常高。可能不是您今天使用的方式(取决于 $path$convertedPath 的来源),但可能在此代码的未来更新中,您允许用户指定生成的文件名。

    【讨论】:

    • 感谢 Paul,我做了一些研究,发现我可以在后台运行该进程,但现在我需要获取后台进程的状态。
    • 我自己没有尝试过类似的东西,所以我不知道您可能会遇到哪些问题。链接的问题建议存储 PID。由于您可能有多个并行用户,我可以想象将其存储在会话中可能是一个不错的选择。然后你想要一个显示状态的页面。要检查该进程是否仍在运行,您可以按照此答案的建议使用if (file_exists( "/proc/$pid" )){stackoverflow.com/a/9874592/2799887
    • 当作为后台进程启动转换时,您将无法再访问标准输出和标准错误(也无法确定进度信息)。因此,将 stdout 和 stderr 写入 $tempdir/$pid.stdout.log$tempdir/$pid.stderr.log 或类似的东西可能是个好主意。
    • 我正在计划实施这个解决方案stackoverflow.com/a/31482600/4626803
    • 我想希望上面提到的事情仍然对你有所帮助。您提到的那个答案指出“使用 Web 重定向、AJAX 或 Web 套接字定期重新检查转换状态。”上面的评论主要是关于那个特定的部分。确保将 PID 存储在某处,并确保您保留对 stdout 和 stderr 的访问权限。这需要能够向用户反馈可能的转换错误,如果您决定让用户访问进度信息(例如完成 45%),也需要这样做。这是否意味着您的原始问题已得到解答?
    猜你喜欢
    • 2014-06-21
    • 2021-06-18
    • 1970-01-01
    • 2018-02-16
    • 2019-02-24
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多