相关文章推荐
豁达的铁链  ·  access ...·  2 月前    · 
慷慨大方的火腿肠  ·  PHP ...·  9 月前    · 
伤情的脸盆  ·  pyspark dataframe ...·  10 月前    · 
自信的数据线  ·  java下载电脑版官网 ...·  1 年前    · 

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

6 人关注

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

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

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

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

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

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

php
ffmpeg
video-streaming
video-encoding
YD8877
YD8877
发布于 2011-06-19
4 个回答
Mridul Kashatria
Mridul Kashatria
发布于 2011-06-19
已采纳
0 人赞同

你应该使用一个叫 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".

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

谢谢你的回答,mridkash。然而,正如你所说的 "然后对文件进行编码,完成后将db标志更新为'完成'",我怎么知道编码已经 "完成"?
当php exec(ffmpeg)调用结束时,有两种可能,要么处理完毕,要么失败。因此,在执行调用之后,你可以检查编码文件是否存在,也许还可以对其运行ffmpeg信息,然后将db标志更新为 "完成"。
根据你的评论,"当php exec(ffmpeg)调用结束时"。我怎样才能确定ffmpeg的调用何时结束。我可以对文件进行定期检查,但即使在编码结束之前,它也可能出现在那里。
php是同步的,所以当你用一个命令调用exec()时,它将停止在那里直到命令结束。一个简单的例子是 <?php echo "starting process\n" ; exec('sleep 10'); echo "job finished\n"; ?>
maaudet
maaudet
发布于 2011-06-19
0 人赞同

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

为了排队,你需要做一个自定义脚本,为每个文件重新运行FFMpeg。

Gaz
Gaz
发布于 2011-06-19
0 人赞同