Php 如何处理多个视频上传过程中视频编码的排队?

Php 如何处理多个视频上传过程中视频编码的排队?,php,ffmpeg,video-streaming,video-encoding,Php,Ffmpeg,Video Streaming,Video Encoding,我正在开发一个视频流网站,用户可以将视频上传到该网站(使用uploadify jquery插件一次上传多个视频) 现在,我面临的问题是将视频编码到FLV,以便在线播放 视频编码过程应该在什么时候进行?是否应在上传完成后立即进行(即,将用户重定向到上传成功页面,然后使用ffmpeg的exec命令在后台开始编码?)但是,使用这种方法,如何确定编码是否已成功完成?如果用户上传损坏的视频,ffmpeg无法对其进行编码,该怎么办?如何在PHP中处理这个问题 由于多个用户可以同时上传视频,我如何对视频编码进

我正在开发一个视频流网站,用户可以将视频上传到该网站(使用uploadify jquery插件一次上传多个视频)

现在,我面临的问题是将视频编码到FLV,以便在线播放

视频编码过程应该在什么时候进行?是否应在上传完成后立即进行(即,将用户重定向到上传成功页面,然后使用ffmpeg的exec命令在后台开始编码?)但是,使用这种方法,如何确定编码是否已成功完成?如果用户上传损坏的视频,ffmpeg无法对其进行编码,该怎么办?如何在PHP中处理这个问题

由于多个用户可以同时上传视频,我如何对视频编码进行排队?FFMpeg有自己的编码队列吗

我还阅读了另一个相关SO线程中的gearman和消息队列选项,如redis和AMQP。这些是潜在的解决方案之一吗


如果有人能回答我的问题,我将不胜感激。

您应该使用名为的软件。它是一个作业服务器,您可以使用PHP调用函数。您可以将进程转移到后台,它会自动处理队列。许多进程也可以并行运行

我用过它,它很容易安装和操作

对于您的用例


完成此过程后,您可以调用另一个函数向用户发送电子邮件、tweet等,告知编码已完成。

由于编码可能需要一些时间,您可能需要在文件夹中添加输入文件,并在数据库中添加条目。然后,您就有了一个脚本,该脚本可以持续运行,也可以每x分钟运行一次,将挂起的视频从数据库转换为FLV格式


要对它们进行排队,您需要创建一个自定义脚本,为每个文件重新运行FFMpeg。

FFMpeg只是一个命令行实用程序。它没有任何队列,您需要构建自己的队列系统来异步执行工作


对于PHP队列,我对beanstalkd服务器有很好的体验,使用的是pheanstalk PHP客户端。然后,您的上传脚本应该将项目插入队列进行编码,并向用户返回一个响应,表示视频将很快被处理。您的工作人员应该从队列中提取项目并对其运行FFMpeg。您可以阅读FFMpeg状态代码以判断编码是否成功完成。

您可以在服务器上使用cron作业,或使用beanstalkd(或本问题其他答案中提到的gearman)之类的工具。

谢谢您的回答mridkash。但是,正如您所说的“然后对文件进行编码,完成后,将db flag更新为‘done’”,我如何知道编码已“完成”?当php exec(ffmpeg)调用结束时,有两种可能,要么处理完成,要么失败。因此,在exec调用之后,您可以检查编码文件是否存在,也可以对其运行ffmpeg info,然后将db标志更新为“done”。根据您的评论,“当php exec(ffmpeg)调用结束时”。如何确定ffmpeg调用何时结束。我总是可以对文件进行定期检查,但即使在编码结束之前,文件也可能存在。php是同步的,因此当您使用命令调用exec()时,它将在那里停止,直到命令结束。一个简单的例子是
Wrap the ffmpeg process in a php file with exec.
Save the uploaded file to db and give it an id. 
Call the encode function after a user uploads file.
As soon as the encode function starts, 
update the db to reflect that the file was "picked".
First run the ffmpeg info on the file to see if it is fine.
Then encode the file and after it is done, update db flag to "done".