2
votes

Comment transmettre un fichier vidéo du compartiment S3 à opencv VideoCapture?

Je travaille sur une fonction aws lambda sur python qui lit les vidéos téléchargées dans un bucket s3 et en extrait quelques images, j'ai déjà le script pour extraire les images avec opencv mais je ne sais pas quel paramètre je devrait passer à cv2.VideoCapture car le fichier n'est accessible que via le bucket s3.

J'ai essayé de transmettre la vidéo en tant qu'objet s3 avec s3.get_object () ainsi qu'avec s3.download_fileobj, rien de tout cela ne semble ça marche tho.

J'ai aussi essayé de ne passer que la clé du fichier vidéo en s3 mais ça n'a pas fonctionné non plus (je ne m'attendais pas à ce que ça marche, mais j'étais désespéré).

Code que j'ai maintenant:

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

J'ai aussi essayé avec:

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()

Mais sans chance non plus

J'obtiens succès = Faux et image = Aucun. Je m'attends à ce que le résultat du succès soit True et que l'image soit un tableau numpy pour pouvoir la lire.


0 commentaires

3 Réponses :


3
votes

OpenCV s'attend à accéder à un fichier sur le disque local.

Vous devrez télécharger le fichier depuis Amazon S3 , puis référencer ce fichier.

Veuillez noter qu'AWS Lambda ne fournit que 500 Mo d'espace disque et uniquement dans le répertoire / tmp / .


1 commentaires

Pendant que VideoCapture d'OpenCV téléchargera un lien (par exemple cv2.VideoCapture (' exemple -videos.com/video/mp4/720/... )) Je ne parviens pas à le télécharger lorsqu'il est appelé depuis un serveur AWS.



1
votes

Vous pouvez essayer de créer une distribution AWS CloudFront pour le bucket s3. Voici le lien du didacticiel: Utiliser CloudFront pour répondre aux requêtes HTTPS S3


0 commentaires

0
votes

Une URL prédéfinie pour l'objet S3 peut être utilisé.

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

vidcap = cv2.VideoCapture(url)


0 commentaires