目标:我有一个允许用户上传视频的应用程序,然后我需要能够立即将这些视频流式传输给其他用户。我目前的设置可以很好地解决这个问题,但我现在想对视频进行转码,以便它们针对移动流媒体进行优化。寻找一些最佳实践,请帮助!
当前设置:我正在使用 S3 存储桶来存储视频资产本身。成功上传后,我将在其他地方创建一个单独的视频对象,其中包含该特定视频的所有元数据,包括检索它的 URL。*请注意,实际上我是通过 AWS CloudFront 进行流式传输的,因此我保存为视频对象属性的 URL 实际上是连接到 S3 存储桶的 CloudFront 分配的基本 URL。
问题:现在我想为移动优化流媒体转码视频。我可以使用弹性转码器运行后台作业,从一个 AWS 存储桶(称为“bucket1”)获取它们,对它们进行转码,然后将它们放入另一个为优化视频指定的存储桶(称为“bucket2”)。但我的问题是,现在当用户上传视频时,流程是这样的:上传到bucket1,并使用元数据创建对应的视频对象。视频对象需要一个 URL,以便我稍后可以流式传输视频。我设置了与 bucket2 关联的 URL(最终将放置优化的视频资产)。问题是,假设我的批处理作业再运行一个小时,但用户在一分钟后请求该视频。显然,bucket2 URL 上还没有优化版本,所以我无法流式传输视频。
我试过的:最近我想,如果不是为转码的视频创建bucket2,我设置我的后台作业从bucket1获取视频,转码,然后再次将它们放回同一个bucket中文件名(覆盖旧的非优化版本)。然后我每个视频只有一个文件,所以最坏的情况是,如果用户在该视频上运行作业之前要求视频,他们仍然会获得内容,它只是未优化的版本。一个问题是弹性转码器显然不允许我覆盖文件(我可以通过将它们放入第二个存储桶中,然后使用 copyObject 操作进行覆盖来解决这个问题,根据这篇文章:aws transcoder overwrite files on s3)。但是,更大的问题是这都需要一个文件名,包括扩展名。如果我想将文件从 .mov 格式(例如)转换为扩展名为 .m3u8 的 hls 播放列表,这似乎是不可能的。
如果有人有任何最佳实践技巧来解决我所描述的问题,我将非常感激!
干杯,布伦丹