【发布时间】:2018-04-23 16:59:43
【问题描述】:
我正在尝试从远程视频流服务器中提取帧,图像类型为 mjpeg,然后上传到 Google Cloud Storage 中的存储桶。
通过我的测试,我能够始终如一地每秒拉出约 30 张图像并将帧保存在我的机器中。但是,当我尝试使用他们的客户端库将所有单个帧上传到 GCS 时,它会先等待上传过程完成,然后返回并上传新收到的帧。
例如,我希望在 1s 内接收并上传所有0...30 图片,但由于我的代码是异步的,它只上传循环中收到的最新图片。
这是我的代码
class GCStream:
def __init__(self):
self.client = storage.Client()
self.bucket = self.client.get_bucket(BUCKET_NAME)
self.frame = None
self.fileName = ""
self.secondCount = 0
self.startSecond = datetime.datetime.now().second
self.vs = VideoStream(src=REMOTE_STREAM_MJPEG).start()
def uploadFrame(self):
try:
blob = self.bucket.blob("{}/{}/{}".format(RPID_FOLDER, BY_DAY, self.fileName))
blob.upload_from_filename(os.path.abspath(self.fileName))
print("{} uploaded to {}/{}".format(self.fileName, RPID_FOLDER, BY_DAY))
os.remove(self.fileName)
except Exception as e:
print(e)
def readFrame(self):
while True:
self.frame = self.vs.read()
self.secondCount = self.secondCount + 1
if datetime.datetime.now().second != self.startSecond:
self.startSecond = datetime.datetime.now().second
self.secondCount = 0
if self.frame is not None:
self.frame = imutils.resize(self.frame, 800)
self.fileName = "{}-{}.png".format(datetime.datetime.now().strftime("%H-%M-%S"), self.secondCount)
cv2.imwrite(self.fileName, self.frame)
self.uploadFrame()
if cv2.waitKey(1) & 0xFF == ord('q'):
break
vs.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
stream = GCStream()
stream.readFrame()
【问题讨论】:
标签: python loops asynchronous stream google-cloud-storage