Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python boto3多部分上传视频到aws s3_Python_Opencv_Amazon S3_File Upload_Boto3 - Fatal编程技术网

Python boto3多部分上传视频到aws s3

Python boto3多部分上传视频到aws s3,python,opencv,amazon-s3,file-upload,boto3,Python,Opencv,Amazon S3,File Upload,Boto3,我想上传一个多部分的视频,我有一个函数,可以读取视频,在帧上做一些处理,现在我想把它发送到aws s3,而不是将它写入本地磁盘。 我已经找到了使用boto3客户端部分上传的方法 import cv2 import boto3 multipart_upload = MultipartUpload(<AWS_BUCKET_NAME>, <AWS_KEY>) multipart_upload.open() video_path = "video.mp4" cap = cv2

我想上传一个多部分的视频,我有一个函数,可以读取视频,在帧上做一些处理,现在我想把它发送到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)



导入cv2
进口boto3
多部件上传=多部件上传(,)
多部分上传。打开()
video\u path=“video.mp4”
cap=cv2.视频捕获(视频路径)
ok=cap.isOpened()
虽然可以:
好的,frame=cap.read()
#对框架进行一些处理
“”“然后使用一些代码将这些帧转换为视频文件可写字节,并收集高达5MB的字节(在aws文档中指定,并传递到上载方法)”
byte_data=帧到视频文件(帧)#我不知道这部分如何工作
多部分上传。上传(字节数据)
多部分上传。关闭()
类多端口负载:
def _u初始(自身、存储桶、密钥):
self.bucket=bucket
self.key=key
self.s3=两个客户端(“s3”)
self.parts=[]
def打开(自):
response=s3.创建多部分上传(ACL=“public read”,Bucket=self.Bucket,ContentType=“video/mp4”,Key=self.Key)
self.upload_id=响应[“UploadId”]
def上传(自身、字节数、零件号):
response=self.s3.upload\u part(Bucket=self.Bucket,Key=self.Key,Body=bytes\u data,PartNumber=part\u number,UploadId=self.upload\u id)
self.parts.append({“ETag”:response[“ETag”],“PartNumber”:part_number})
def关闭(自我):
response=self.s3.complete\u multipart\u upload(Bucket=self.Bucket,Key=self.Key,UploadId=self.upload\u id,MultipartUpload={“Parts”:self.Parts})
打印(答复)

不要重新发明轮子。Boto3管理多部分和非多部分传输。是的。但是,当我的磁盘上有一个完整的文件时,它会很有帮助,我的用例是我有数据流(视频帧),我想作为视频文件上传。不要重新发明轮子。Boto3管理多部分和非多部分传输。是的。但当我的磁盘上有一个完整的文件时,它会很有帮助,我的用例是我有数据流(视频帧),我想上传为视频文件