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


How to handle queueing of video encoding during multiple video uploads?

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

现在,我面临着将视频编码到FLV以便在线流媒体播放的问题。

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

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

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

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

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

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

对于您的用例,

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".

流程完成后,您可以调用另一个函数向用户发送电子邮件、推特等,以表明编码已完成。

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

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

您可以在服务器上使用cron作业,或者使用类似beanstalkd(或gearman,如本问题的其他答案中所述)的东西。

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

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