Я хочу загрузить видео в нескольких частях, у меня есть функция, которая читает видео, выполняет некоторую обработку кадра, и теперь вместо записи его на локальный диск я хочу отправить его на 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)