如何将视频文件从S3存储桶传递到opencv VideoCapture?

Jos*_*hez 2 opencv amazon-s3 amazon-web-services python-3.x aws-lambda

我正在 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()
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

   vidcap = cv2.VideoCapture(s3.download_fileobj(Bucket=bucket_name, Key=video_key, Fileobj=io.BytesIO())
Run Code Online (Sandbox Code Playgroud)

但也没有运气

我得到成功=假和图像=无。我希望 success 的输出为 True 并且图像是一个 numpy 数组以便能够读取它。

Jay*_*Jay 12

可以使用 S3 对象的预签名 url

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

vidcap = cv2.VideoCapture(url)
Run Code Online (Sandbox Code Playgroud)