PubSub - самый эффективный способ публикации видеокадров? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть служба, которая генерирует несколько кадров из видеоисточника (используя 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]

И теперь это намного быстрее.

Я проведу еще один тест на более крупной машине.

...