FFMpeg中的on方法如何工作?

时间:2016-11-19 18:59:36

标签: php symfony

我正在查看名为FFMpeg的库,我相信它在symfony2中使用。在示例中有一个方法如下所示:

$format->on('progress', function ($video, $format, $percentage) {
    echo "$percentage % transcoded";
});

反过来,它会显示浏览器的实时进度。我正在寻找一个非常简单的例子,它的工作原理和任何能够非常清楚地解释它的博客一样。我渴望学习。

1 个答案:

答案 0 :(得分:1)

我对该库不熟悉,但从您发布的代码判断,第二个函数是php中的回调而不是javascript,此时没有任何内容呈现给浏览器。完成函数执行完毕后,最后得到的就是echo部分。

让我稍微概括一下,因为我已经看到相同数量的问题

在PHP中正确实现长进程

基本上如果在php中有一个长时间运行的函数,你永远不会在views内调用它,或者这也可以说是你从未直接从javascript XHR调用它,因为这会阻止该请求。正确的方法涉及队列 websockets (或旧浏览器的XHR轮询)

redis中的队列

来自您的代码库

$format->on('progress', function ($video, $format, $percentage) {
    echo "$percentage % transcoded";
});

不是调用将输出输出到output stream的echo函数,而是将其推入带有channel的redis队列。将channel视为简单的聊天室。

从浏览器中调用状态

建立到服务器端点的websocket连接,该端点POPS队列中的值并将其发送到客户端。此端点可能也可能不是用PHP编写的,因为它不是您正在编写的API的一部分,而是更多WebSocket连接处理程序。

调用函数

现在您可能已经意识到您确实需要以某种方式启动该功能。为此,您可以使用celery之类的库,或者如果您想批量处理,也可以转到CRON

实现将是一个简单的PHP view,它将作业添加到芹菜中,并在作业成功添加到进程时返回请求的状态。

为了更清楚,我正在添加一个简单的图表来帮助完成这个过程

enter image description here