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

时间:2011-06-18 18:16:49

标签: php ffmpeg video-streaming video-encoding

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

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

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

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

我还在另一个相关的SO线程中阅读了有关齿轮手和消息排队选项的信息,例如redis和AMQP。这些是潜在的解决方案吗?

如果有人能回答我的问题,我真的很感激。

4 个答案:

答案 0 :(得分:2)

您应该使用名为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".

完成此过程后,您可以调用另一个函数向用户发送编码完成的电子邮件,推文等。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

你可以在服务器上使用cron作业,或者使用像beanstalkd(或者在这个问题的其他答案中提到的gearman)这样的东西。

答案 3 :(得分:1)

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

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