在开发一个允许用户将视频和图像上传到服务器并让它们由FFMPEG转码并存储在亚马逊S3中的应用程序时,人们认为最重要的问题是什么?我有几个选择;
1)在处理文件上传的同一台服务器上安装FFMPEG,当视频上传并存储在EC2实例上时,调用FFMPEG进行转换然后完成后,将文件写入S3存储桶并处理原始文件。
这有多可扩展?当许多用户同时上传时会发生什么?如何一次管理多个流程?我如何知道何时启动另一个实例并对此配置进行负载平衡?
2)有一台服务器用于处理上传(更新数据库,重命名文件等)和一台服务器进行转码。再次,管理多个流程的最佳方法是什么?我应该看看亚马逊SQS吗?我可以告诉转码服务器从上传服务器获取文件,还是应该将文件复制到转码服务器?我应该只存储S3上的所有文件,SQS可以从那里读取。我想尽可能减少流量。
我正在运行一个linux box作为上传服务器,并在此上运行FFMPEG。
有关建立此类配置的最佳做法的任何建议将不胜感激。非常感谢
答案 0 :(得分:12)
每次有人上传文件进行转码时,我都不认为你会想要启动一个新的FFMPEG实例。相反,您可能希望启动与您拥有的CPU数量相同数量的FFMPEG进程,然后将要转码的输入文件排队,并按接收顺序执行。你可以在一台计算机上完成这一切,我不认为接受上传并将它们放入队列的服务器需要占用大量CPU,并且可能与FFMPEG进程完全共存。
取决于你想要扩展到多大(如果你想在一台机器上做的不仅仅是几个FFMPEG进程),你可以很容易地进行分布,这就是SQS派上用场的地方。您可以为每个核心运行1个FFMPEG进程,而不是在本地队列中查找数据,它可以查看SQS。然后,您可以在不同的计算机上实例化所需的转码过程。
缺点是,您需要将原始视频从接受它们的服务器传输到需要对其进行转码的服务器。你可以将它们放入S3,然后从S3中取出它们,但如果你不得不为此付出代价,我就不记得了。或者,您可以将它们保存在接收它们的计算机的硬盘上,并使用转码过程去获取原始文件。
答案 1 :(得分:1)
你应该看看Amazon Elastic Transcoder。它解决了你在问题中提到的几乎所有问题。
答案 2 :(得分:1)
实际上有很多方法可以解决您的问题:
1 - 使用ec2 cron jobs,您可以运行一个简单的PHP脚本来检查您的数据库(例如,每30秒)是否有可用于转码的新视频(您可以使用简单的数据库属性) ,processed:Boolean)
2 - 使用aws Lambda服务来检测上传到你的s3存储桶的任何新视频,触发lambda函数以获得拇指&转码,将输出发送到目标存储桶。通过@binoculars检查此greate工具需要一些js&知道,但它非常方便&光滑。
3 - 使用aws transcoder。这是非常昂贵的。如果你要四舍五入到最近的分钟,那么当你的视频很短时,这是一笔巨大的费用。如果你是Netflix或亚马逊运行长期工作来转码电影,那么ET会更有意义。
答案 3 :(得分:1)
您可以查看Piper。它是我最初为一家大型娱乐公司制作的产品的开源版本,可以大规模处理视频转码。