output.txt 2>&1"); 我也在 -6ren">
gpt4 book ai didi

php - 在 php 中使用 shell_exec 作为 Windows 中的后台进程运行 ffmpeg 命令

转载 作者:行者123 更新时间:2023-12-04 23:00:36 31 4
gpt4 key购买 nike

我正在尝试从 .mp4 转换视频至.flv在 php 中使用:

shell_exec("ffmpeg -i input.mp4 output.flv 1>output.txt 2>&1");

我也在 output.txt 中输出整个过程用于在 javascript 中创建进度条的文件(这不是这里的问题)。

问题是:
如果视频(input.mp4) 大小>50Mb,则完成 shell_exec 需要很长时间(> 30 秒)。这会不必要地挂起 UI。

所以我想知道的是:
  • 有什么方法可以制作shell_exec与脚本的其余部分一起工作?
  • 我只需要发起ffmpeg.exe通过 php脚本,然后 php 脚本可以终止。
  • 一旦进程启动javascript将开始它的魔法(在客户端)。

  • 所以我需要执行 shell_exec异步的。与脚本的其余部分。一旦进程启动,脚本应该通过简单的 echo 通知客户。 ing。它不应该等待 ffmpeg.exe完成其工作。可能吗?

    我在 SO 上看到了几个类似的问题,其中许多都描述了相同的问题

    前任:

    Run a ffmpeg process in the background

    Run PHP Task Asynchronously

    ffmpeg Progress Bar - Encoding Percentage in PHP

    Can ffmpeg show a progress bar?

    等等

    但是

    他们都在使用 linux操作系统或使用 curl .我正在使用 windows 8 (没有 curl 和除 ffmpeg.exe 之外的任何其他附加组件的 wamp)。

    那么有可能吗?这里的专家可以再帮我一次吗?

    提前致谢。

    最佳答案

    这里应该提到一个重要的注意事项。 ffmpeg 命令行工具使用 stderr 输出错误日志消息,并保留 stdout 以供可能使用管道(将 ffmpeg 生成的输出媒体流重定向到其他命令行工具)。话虽如此,如果您在后台运行 ffmpeg,您很可能希望将 stderr 重定向到日志文件,以便稍后检查。

    还要注意的另一件事是标准输入(stdin)。命令行 ffmpeg 工具被设计为一个交互式实用程序,它接受用户的输入(通常来自键盘)并在用户的当前屏幕/终端上报告错误日志。当我们在后台运行 ffmpeg 时,我们想告诉 ffmpeg 不应接受(也不等待)来自标准输入的输入。我们可以告诉 ffmpeg,再次使用 I/O 重定向“

    <?php


    echo "Starting ffmpeg...\n\n";
    echo shell_exec("ffmpeg -y -i input.avi output.avi </dev/null >/dev/null 2>/var
    /log/ffmpeg.log &");
    echo "Done.\n";
    ?>

    ​“-y”选项用于自动覆盖输出文件(output.avi)而不要求确认是/否。如果您需要相反的情况,如果输出文件已经存在,则自动取消整个过程,然后使用“-n”选项。

    一些 PHP 库允许将 ffmpeg 调用包装到 PHP 对象中,如果您不喜欢使用命令行,可以使用很好的语法。其中之一是积极维护的 PHP-FFMpeg。除了安装 PHP 组件外,它只需要您下载最近的 ffmpeg 和 ffprobe 构建。然后你可以像这样运行 PHP 代码:
    $ffmpeg = FFMpeg\FFMpeg::create();
    $video = $ffmpeg->open('video.mpg');
    $video->filters()->resize(new FFMpeg\Coordinate\Dimension(320, 240))->synchronize();
    $video->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')

    注意:​ffmpeg-php 是自 2007 年以来未开发的扩展(并且需要“ffmpeg-0.4.9_pre1 或更高版本”),这意味着您只能使用非常旧的 ffmpeg 版本,无法将其更新为最新版本。由于每天都在进行大量更改/改进,因此在 ffmpeg 的代码中,它使 ffmpeg-php 与最新的 ffmpeg 不兼容。

    关于php - 在 php 中使用 shell_exec 作为 Windows 中的后台进程运行 ffmpeg 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24872943/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com