【问题标题】:How to pass video file from S3 bucket to opencv VideoCapture?如何将视频文件从 S3 存储桶传递到 opencv VideoCapture?
【发布时间】:2019-11-28 21:58:20
【问题描述】:

我正在 python 上开发一个 aws lambda 函数,它读取上传到 s3 存储桶的视频并从中提取一些帧,我已经有了用 opencv 提取帧的脚本,但我不知道我是什么参数应该传递给 cv2.VideoCapture,因为该文件只能通过 s3 存储桶访问。

我尝试使用 s3.get_object() 以及 s3.download_fileobj 将视频作为 s3 对象传递,但这些似乎都不起作用。

我也尝试在 s3 中仅传递视频文件的密钥,但它也不起作用(我没想到这会起作用,但我很绝望)。

我现在拥有的代码:

import boto3
import cv2
import io

def lambda_handler(event, context):
   s3 = boto3.client("s3")
   bucket_name = "my_bucket"
   video_key = "videos/video.mp4"
   vidcap = cv2.VideoCapture(s3.get_object(Bucket=bucket_name,Key=video_path))
   success,image = vidcap.read()

我也试过:

   vidcap = cv2.VideoCapture(s3.download_fileobj(Bucket=bucket_name, Key=video_key, Fileobj=io.BytesIO())

但也没有运气

我得到了成功 = False 和 image=None。我希望成功的输出是 True 并且图像是一个能够读取它的 numpy 数组。

【问题讨论】:

    标签: python-3.x amazon-web-services opencv amazon-s3 aws-lambda


    【解决方案1】:

    OpenCV 期望访问本地磁盘上的文件。

    您需要从 Amazon S3 下载文件,然后引用该文件。

    请注意,AWS Lambda 仅提供 500MB 的磁盘空间,并且仅在 /tmp/ 目录中。

    【讨论】:

    【解决方案2】:

    您可以尝试为 s3 存储桶创建 AWS CloudFront 分配。这里是教程链接:Use CloudFront to serve HTTPS requests S3

    【讨论】:

      【解决方案3】:

      可以使用用于 S3 对象的 presigned url

      url = s3_client.generate_presigned_url( ClientMethod='get_object', Params={ 'Bucket': bucket, 'Key': key } )
      
      vidcap = cv2.VideoCapture(url)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        • 2017-11-23
        • 2022-08-20
        相关资源
        最近更新 更多