我正面临着这个问题,我希望让用户直接上传文件到Amazon S3上的存储桶。 这一步可以像这里所描述的那样轻松完成。
但是如果我需要用FFMPEG
编辑每个文件呢?
例如。
shell_exec('ffmpeg -i /sample.wav -acodec libmp3lame /sample.mp3');
目前,我首先将文件存储到我的服务器,运行shell命令,然后使用putObject
将它们发送到S3,但有没有更好的方法来完成这一点,让我的服务器安静?
我的规格:
我对你的解决scheme的理解让我觉得你希望使用你已经有的同样的Ubuntu服务器来执行你上传的媒体文件的转码。
问题是存储在S3中的对象不能像普通文件系统上的文件那样访问,您可以从S3下载文件并在Web服务器实例上处理它,但这将是一个复杂而且可能效率低下的设置。
将代码转换过程从你的Ubuntu服务器中分离出来,让它以真正的云端风格发生,会更好。 最好的解决scheme是S3事件和Lambda。
所以根据我对您的使用案例的理解,我将为您的解决scheme推荐:
关于实例的UserData,下面是您可能希望执行的步骤:
创build一个已经安装了ffmpeg的AMI可能会更好,但是您需要决定是花费5分钟还是花费5分钟的时间来对每个实例进行系统化处理或支付AMI以便随时使用。 我会说,除非你的处理时间超过一个小时,或者你的用例需要尽快的返回文件,否则你最好每次安装ffmpeg作为整个AWS账单,即使你只用了15分钟。
这种方法的build议:
当新创build的文件被创build时,您可能希望进行进一步的活动,那么为什么不使用s3事件来启动另一个Lambda进程呢? 🙂
此外,为了保持清洁,如果您的解决scheme允许,请尝试将您创build的file upload到s3,然后将其放在上传文件的不同位置。
备用选项:使用弹性代码转换器
另一种select是使用AWS Elastic Transcoder服务。 您可以通过在更新S3存储桶时触发lambda来以相同的方式将作业发送到代码转换器,并处理该存储桶中的文件。 弹性代码转换器然后可以通知SNS队列,然后可以触发电子邮件或另一个Lambda查询来处理创build的文件。
弹性代码转换器将是一个更酷,可能更好的方法,但它将需要更多的工作。
Elastic Transcoder需要您创build一个pipe道,然后使用该pipe道创build一个作业。 我会链接你的每个JavaScript SDK。
CreatePipline http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElasticTranscoder.html#createPipeline-property
CreateJob http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElasticTranscoder.html#createJob-property
替代替代解决scheme:使用Amazon SQS
如果您希望在ubuntu实例上进行处理,而不是从Lambda旋转另一个实例,则可以使用S3事件来触发lambda将作业发布到Amazon SQS。
然后,Amazon SQS将让您自己创build的代理为Amazon SQS轮询作业,然后让作业参考s3中需要转码的文件。 这是相当复杂的,但我只包括它的完整性,除非你真的需要在你已经拥有的Ubuntu实例上执行这个工作。