【问题标题】:Running ffmpeg command using shell_exec in php as a background process in windows在 php 中使用 shell_exec 作为 Windows 中的后台进程运行 ffmpeg 命令
【发布时间】:2014-09-12 10:06:57
【问题描述】:

我正在尝试在 php 中将视频从 .mp4 转换为 .flv

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 与脚本的其余部分一起工作?

  • 我只需要通过php脚本启动ffmpeg.exe,然后php脚本就可以终止了。

  • 一旦进程启动javascript 将开始它的魔法(在客户端)。

所以我需要执行shell_exec async。与脚本的其余部分。并且一旦启动该过程,脚本应该通过简单的echoing 通知客户。它不应该等待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)。

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

提前致谢。

【问题讨论】:

    标签: php windows ffmpeg wamp


    【解决方案1】:

    这里应该提到一个重要的注意事项。 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 不兼容。

    【讨论】:

      【解决方案2】:

      是的,你可以在windows中使用下面的命令在后台运行FFmpeg而不需要重新加载整个页面。

       pclose(popen("start /B C:/xampp/htdocs/video/bin/ffmpeg  -i input.mp4 output.flv , r"));
      

      这是 ffmpeg 在我的电脑中的位置,你可以使用你的 ffmpeg 位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        相关资源
        最近更新 更多