从S3读取视频文件对象,并将其用于通过Opencv进行进一步处理

时间:2018-10-04 14:29:45

标签: python-3.x opencv amazon-s3 boto3 video-processing

import boto3

import cv2
import numpy as np
s3 = boto3.resource('s3')
vid = (s3.Object('bucketname', 'video.blob').get()['Body'].read())
cap = cv2.VideoCapture(vid)

这是我的代码。我在s3存储桶中有一个视频文件。我想使用OpenCV对其进行一些处理,而又不想下载它。因此,我正在尝试将该视频文件存储到vid中。现在的问题是type(vid)byte,这是导致在第6行出现此错误TypeError: an integer is required (got type bytes) 的原因。我尝试将其转换为整数或字符串,但是无法。

在尝试将字节转换为整数时:我引用了this并遇到了长度问题。这只是一个示例视频文件。当要转换为字节对象时,我要处理的实际文件将会很大。

尝试将对象作为字符串获取,然后将其转换为整数:我引用了this。甚至这似乎对我也不起作用。

如果有人可以帮助我解决此问题,我将不胜感激。如果您对我的问题不确定,请发表评论,我将尝试提供更多详细信息。

2 个答案:

答案 0 :(得分:1)

如果从 url 流式传输视频是可以接受的解决方案,我认为这是最简单的解决方案。您只需要生成一个网址即可从中读取视频。

import boto3
import cv2

s3_client = boto3.client('s3')
        
bucket = 'bucketname'      
key = 'video.blob' 
            
url = s3_client.generate_presigned_url('get_object', 
                                       Params = {'Bucket': bucket, 'Key': key}, 
                                       ExpiresIn = 600) #this url will be available for 600 seconds
    
cap = cv2.VideoCapture(url)
       
ret, frame = cap.read() 

您应该看到您能够从该网址读取和处理帧。

答案 1 :(得分:-2)

请参阅下面的有用代码段,以对S3存储桶执行各种操作。

import boto3
s3 = boto3.resource('s3', region_name='us-east-2')

用于列出s3中的存储桶

for bucket in s3.buckets.all():
    print(bucket.name)

在s3中创建存储桶

my_bucket=s3.create_bucket(Bucket='Bucket Name', CreateBucketConfiguration={
    'LocationConstraint': 'us-east-2'
})

列出存储桶中的对象

my_bucket = s3.Bucket('Bucket Name')
for file in my_bucket.objects.all():
    print (file.key)        

从当前目录上载文件

import os
print(os.getcwd())

fileName="B01.jpg"
bucketName="Bucket Name"
file = open(fileName)
s3.meta.client.upload_file(fileName, bucketName, 'test2.txt')   

从存储桶中读取图像/视频

import matplotlib.pyplot as plt
s3 = boto3.resource('s3', region_name='us-east-2')
bucket = s3.Bucket('Bucket Name')   # bucket name
object = bucket.Object('maisie_williams.jpg')  # image name
object.download_file('B01.jpg')            #donwload image with this name
img=plt.imread('B01.jpg')              #read the downloaded image
imgplot = plt.imshow(img)              #plot the image
plt.show(imgplot)  

从一个存储桶中读取,然后将其转储到另一个存储桶中

import boto3
s3 = boto3.resource('s3', region_name='us-east-2')
bucket = s3.Bucket('Bucket Name')   # bucket name
object = bucket.Object('maisie_williams.jpg')  # image name
object.download_file('B01.jpg')



fileName="B01.jpg"
bucketName="Bucket Name"
file = open(fileName)
s3.meta.client.upload_file(fileName, bucketName, 'testz.jpg')

如果您具有访问键,则可以进行以下操作

keys = pd.read_csv('accessKeys.csv')
        #creating Session for S3 buckets
        session = boto3.session.Session(aws_access_key_id=keys['Access key ID'][0],
            aws_secret_access_key=keys['Secret access key'][0])
        s3 = session.resource('s3')

        buck = s3.Bucket('Bucket Name')