使用CookPete/react播放器从S3播放HLS视频



在我的s3 bucket中,我有两个对象:

  • https://mybucketname.s3-eu-west-1.amazonaws.com/public/myfilename.m3u8
  • https://mybucketname.s3-eu-west-1.amazonaws.com/public/myfilename_360.ts

因为我使用的是AWS Amplify的Storage.get,所以我可以获得一个签名的url。因此,当我使用react播放器在前端请求签名的.m3u8链接时https://github.com/CookPete/react-player,一切都很好。然而,玩家会自动执行对.ts url的get请求,所以我得到了一个403禁止的错误,因为这个url没有签名。

在播放器自动执行对.ts文件的获取请求之前,我希望能够使用Storage.get对其进行签名(或者能够在获取请求之前执行任何其他逻辑(,然后才使用AWS Amplify,用这个签名的.ts url执行获取请求。

AWS在GitHub上有放大视频样本:https://github.com/awslabs/amplify-video

还有一个云信息模板,以及关于设置后台以根据上传到S3的文件自动创建VOD资产的详细信息:https://aws.amazon.com/solutions/implementations/video-on-demand-on-aws/

这起到了作用并简化了设置。

如果您需要通过已签名的url来完成此操作,则可以使用AWS。CloudFront。Signer(在nodejs中,必须也有其他语言版本(:

const cloudFront = new AWS.CloudFront.Signer(publicKey, privateKey);
const policy = JSON.stringify({
Statement: [
{
Resource: 'https://*',
Condition: {
DateLessThan: {
'AWS:EpochTime': 1757120800,
},
},
},
],
});
const url = cloudFront.getSignedCookie({
policy,
});
console.log(url);

请注意,公私密钥应为:

  • 一个SSH-2 RSA密钥对
  • 以base64编码的PEM格式
  • 2048位的密钥对

参考:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-内容创建cloudfront密钥对

上面的privateKey将是生成的;您还可以从生成的私钥.pem文件中读取字符串。但是,公钥将是公钥Id,而不是公钥本身。在上面的参考中,它告诉您需要如何创建一个密钥组并在那里上传生成公钥。上传公钥时,会有一个id被分配给它。这个id需要传递给AWS的第一个参数。CloudFront。签名构造函数。

然而,顺便说一句,如果你计划流式传输视频,不建议使用签名url方法。

原因很简单:你正在流媒体播放,因为你可能想更快地加载视频,获得更好的视频体验。签名是CPU昂贵的,所以签名字符串(这里,url(需要一些时间(在这里阅读更多关于如何在引擎盖下工作的信息:https://en.wikipedia.org/wiki/RSA_(密码系统(#加密(。如果这是一次性的事情就好了。但也需要对每个.ts url进行签名。

我已经在这里解释了如何做到这一点:https://stackoverflow.com/a/67929204/5657783

最新更新