【问题标题】:Amplify Video - How to upload a video to the "Input" bucket with swift?放大视频 - 如何使用 swift 将视频上传到“输入”存储桶?
【发布时间】:2021-04-10 01:28:38
【问题描述】:

我有一个使用 Amplify 作为后端的 IOS 项目。我还加入了 Amplify Video 以支持视频点播。将 Amplify Video 添加到项目后,会生成“输入”和“输出”存储桶。当通过 Amplify 控制台进行可视化时,这些会出现在我的项目环境之外。它们只能通过导航到 AWS S3 控制台来访问。我的问题是,如何通过 Amplify 将我的视频通过 swift 上传到“输入”存储桶(或者我不上传)?我下面的代码将视频上传到项目环境中的 S3 存储桶。几乎不支持 Amplify Video for IOS (Amplify Video Documentation)

if let vidData = self.convertVideoToData(from: srcURL){
                let key = "myKey"
                //let options = StorageUploadDataRequest.Options.init(accessLevel: .protected)
                Amplify.Storage.uploadData(key: key, data: vidData) { (progress) in
                    print(progress.fractionCompleted)
                } resultListener: { (result) in
                    switch result{
                    case .success(_ ):
                        print("upload success!")
                    case .failure(let error):
                        print(error.errorDescription)
                    }
                }
            }

【问题讨论】:

    标签: ios aws-amplify video-on-demand


    【解决方案1】:

    我也面临同样的问题。据我所知,iOS Amplify 库的 amplifyconfiguration.json 仅限于使用 S3TransferUtility 下的一种存储规范。

    我自己正在解决这个问题,但快速的解决方案是修改创建的 AWS 视频资源以运行相同的存储桶(输入和输出)。现在请注意,我是一名 iOS 工程师,不是后端,只是熟悉 AWS。

    解决方法如下:

    • 放大视频插件创建的输入桶在属性选项卡下有 4 个事件通知。这些都启动了一个 VOD-inputWatcher lambda 函数。将这 4 个通知复制到您的原始存储桶中
    • 输出存储桶有两个事件通知,将它们也复制到原始存储桶中

    立即尝试该过程,手动将视频放入您的存储桶。它会失败,但我们会看到进展 - MediaConvert 作业已启动,但会告诉您它失败,因为它没有读取存储桶中文件的权限。像Unable to open input file, Access Denied 这样的东西。让我们解决这个问题:

    • 转到输入 lambda 函数并添加此函数:
    async function enableACL(eventObject) {
      console.log(eventObject);
        const objectKey = eventObject.object.key;
        const bucketName = eventObject.bucket.name;
        const params = {
          Bucket: bucketName,
          Key: objectKey,
          ACL: 'public-read',
        };
        console.log(`params: ${eventObject}`);
        s3.putObjectAcl(params, (err, data) => {
          if (err) {
            console.log("failed to set ACL");
            console.log(err);
          } else {
            console.log("successfully set acl");
            console.log(data);
          }
        });
    }
    

    现在从事件处理程序中调用它,不要忘记在文件顶部添加const s3 = new AWS.S3({});

    exports.handler = async (event) => {
      
      // Set the region
      AWS.config.update({ region: event.awsRegion });
      console.log(event);
      if (event.Records[0].eventName.includes('ObjectCreated')) {
        await enableACL(event.Records[0].s3);
        await createJob(event.Records[0].s3);
        const response = {
          statusCode: 200,
          body: JSON.stringify(`Transcoding your file: ${event.Records[0].s3.object.key}`),
        };
        return response;
      }
    };
    

    再次尝试该过程。 lambda 将失败,您可以在 lambda 的 CloutWatch 中看到它:failed to set ACL. INFO AccessDenied: Access Denied at Request.extractError。为了解决这个问题,我们需要向输入 lambda 函数授予 S3 权限。

    通过导航到 lambda 函数的配置/权限并找到角色来做到这一点。在 IAM 中打开它并添加完整的 S3 访问权限。不理想,但同样,我只是想让这项工作。仅指定确切的 Bucket 和正确的操作可能会更好。非常感谢任何有关适当角色的帮助:)

    对输出 lambda 函数的角色也重复相同的操作,为其赋予正确的 S3 权限。

    再次尝试上传文件。此时如果你遇到这个错误: failed to set ACL. INFO NoSuchKey: The specified key does not exist. at Request.extractError。这是因为在存储桶中,protected 文件夹中有对象。尝试改用公用文件夹(在 iOS 库中,您必须使用 StorageAccessLevel.guest 权限才能访问它)

    现在将文件放到public 文件夹中。您应该会看到 MediaConvert 作业再次启动。它仍然会失败(检查 MediaConvert / Jobs),说它没有写入 S3 存储桶 Unable to write to output file .. 的权限。您可以通过再次转到输入 lambda 函数来解决此问题,这将授予 MediaConvert 作业的权限:

    const jobParams = {
        JobTemplate: process.env.ARN_TEMPLATE,
        Queue: queueARN,
        UserMetadata: {},
        Role: process.env.MC_ROLE,
        Settings: jobSettings,
      };
      await mcClient.createJob(jobParams).promise();
    

    转到输入 lambda 函数,配置/环境变量。该函数使用字段MC_ROLE 为媒体转换作业提供角色名称。复制角色名称并在 IAM 中查找。通过将对角色的正确 S3 访问权限添加到您的存储桶来修改其权限。

    如果您只尝试更多时间,输出应该会出现在您的输入文件旁边。

    为了能够在 iOS 中使用当前的 Amplify.Storage.downloadFile(key: {key}, ...) 函数读取 s3://public/{userIdentityId}/{videoName}/{videoName}{quality}..m3u8 文件,您可能必须附加到密钥正确路径并删除 .mp4 扩展名。如果您遇到任何问题,请告诉我,我现在也在整理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 2019-03-28
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多