Python boto3 многокомпонентная загрузка видео в aws s3 - PullRequest
0 голосов
/ 09 мая 2020

Я хочу загрузить видео в нескольких частях, у меня есть функция, которая читает видео, выполняет некоторую обработку кадра, и теперь вместо записи его на локальный диск я хочу отправить его на aws s3. Я нашел способ загрузки по частям с помощью клиента boto3

import cv2
import boto3


multipart_upload = MultipartUpload(<AWS_BUCKET_NAME>, <AWS_KEY>)
multipart_upload.open()
video_path = "video.mp4"
cap = cv2.VideoCapture(video_path)
ok = cap.isOpened()
while ok:
    ok,frame = cap.read()

    # do some processing on the frame

    """ then some code to convert these frames into video file writable bytes and collect bytes upto 5MB (specified in aws docs and pass to upload method)"""

    byte_data = frames_to_video_files(frame)  # i am not able to figure out how this part will work

    multipart_upload.upload(byte_data)

multipart_upload.close()


class MultipartUpload:

   def __init__(self,bucket,key):
       self.bucket = bucket
       self.key = key
       self.s3 = boto3.client("s3")
       self.parts = []

   def open(self):
       response = s3.create_multipart_upload(ACL="public-read",Bucket=self.bucket,ContentType="video/mp4",Key=self.key)
       self.upload_id = response["UploadId"]

   def upload(self,bytes_data,part_number):
       response = self.s3.upload_part(Bucket=self.bucket,Key=self.key,Body=bytes_data,PartNumber=part_number,UploadId=self.upload_id)
       self.parts.append({"ETag":response["ETag"],"PartNumber":part_number})

   def close(self):
       response = self.s3.complete_multipart_upload(Bucket=self.bucket,Key=self.key,UploadId=self.upload_id,MultipartUpload={"Parts":self.parts})
       print(response)



...