У меня есть служба, которая генерирует несколько кадров из видеоисточника (используя OpenCV)
Затем я кодирую эти кадры в строку байтов и публикую их как пакет через Pub / Sub
# Encoding each (opencv) frame
_, buffer = cv2.imencode('.jpg', frame)
pub_sub.publish(buffer.tobytes())
# PubSub class
class PubSub(object):
def __init__(self, project_id='xxx', topic_name='xxx'):
self.publisher = pubsub_v1.PublisherClient(
pubsub_v1.types.BatchSettings(max_latency=1)
)
self.topic_path = self.publisher.topic_path(project_id, topic_name)
def publish(self, frame_as_bytes):
future = self.publisher.publish(self.topic_path, data=frame_as_bytes)
print(future.result())
print('Published messages with batch settings.')
Мои байтовые кадры = около 300 КБ данных
Но задержка здесь очень велика, как я могу улучшить эти операции?
Обновление :
Что ж, похоже, операция кодирования opencv стоит дорого:
_, buffer = cv2.imencode('.jpg', frame, encode_param)
Я запускаю программу на своем ноутбуке, поэтому я считаю, что это не будет проблемой для виртуальной машины с большим количеством ЦП.
Я добавил эти строки, чтобы уменьшить вес изображения перед кодированием:
frame = frame_helper.rescale_frame(frame, scale_percent=40)
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 80]
И теперь это намного быстрее.
Я проведу еще один тест на более крупной машине.