Использование Python для анализа и рендеринга видеопотоков Kinesis и получения представления изображения входного кадра - PullRequest
0 голосов
/ 29 марта 2020

Я настроил конвейер, в котором я транслирую потоковое видео в Kinesis Video Stream (KVS), который отправляет кадры в Amazon Rekognition для распознавания лиц, а затем отправляет их в Kinesis Data Stream (KDS). Наконец, KDS отправляет результаты в лямбду.

Для кадра, в котором было выполнено распознавание лиц, я получаю JSON следующего формата: https://docs.aws.amazon.com/rekognition/latest/dg/streaming-video-kinesis-output-reference.html

Моя цель: Используя это JSON, я как-то хочу получить представление изображения кадра, который был записан KVS.

Что я пробовал:

Это JSON дает мне номер фрагмента.

Я использую этот номер фрагмента и вызываю get_media_for_fragment_list

Приведенный выше вызов возвращает ключ с именем Payload в ответ.

Я пытался каким-то образом отобразить эту полезную нагрузку в изображение.

Однако я не могу делать это каждый раз, так как не знаю, как разобраться в этом полезном грузе и расшифровать его.

Ниже приведен фрагмент кода.

    def getFrameFromFragment(fragment):
         client = boto3.client('kinesis-video-archived-media',endpoint_url=data_endpoint_for_kvs)
         response = client.get_media_for_fragment_list(
             StreamName='kvs1',
             Fragments=[
                fragment,
             ]
         )
         payload = response['Payload']
         print(payload.read())

Как использовать эту полезную нагрузку для получения изображения?

Мне известны парсеры, которые существуют в Java: https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-renderer.html

Однако я хотел бы узнать о решении в Python.

В случае, если мое утверждение вопроса неверно или не имеет смысла, не стесняйтесь спрашивать меня об этом подробнее вопрос.

Спасибо за помощь. :)

Ответы [ 3 ]

0 голосов
/ 30 марта 2020

Ответ от GetMedia - это поток в формате упаковки MKV. Во-первых, вам нужно использовать библиотеку Python, которая извлекает кадры из формата MKV (https://github.com/vi/mkvparse или аналогичные). Далее ваш поток, вероятно, будет закодирован. Например H264. Вам также нужно будет декодировать кадр, чтобы получить фактическое растровое изображение, если это то, что вам нужно. Кажется, есть несколько программных декодеров, доступных для Python: https://github.com/DaWelter/h264decoder

Я не знаком с этими проектами.

0 голосов
/ 02 апреля 2020

После получения полезной нагрузки с использованием следующего кода,

kvs_stream = kvs_video_client.get_media(
                 StreamARN="ARN", 
                 StartSelector= 
                              {'StartSelectorType':'FRAGMENT_NUMBER',
                               'AfterFragmentNumber': decoded_json_from_stream['InputInformation']['KinesisVideo']['FragmentNumber']
                              }
                                       )

вы можете использовать,

 frame = kvs_stream['Payload'].read()

для получения, чтобы получить кадр из полезной нагрузки. Теперь вы можете открыть файл mvi и записать в него этот кадр, а затем извлечь из этого файла mvi определенный кадр, используя openCV.

with open('/tmp/stream.avi', 'wb') as f:
                f.write(frame)
                cap = cv2.VideoCapture(file.mvi)
                #use frame for further processing
0 голосов
/ 30 марта 2020

Полезная нагрузка, которую вы получаете, имеет формат MKV: https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_reader_GetMediaForFragmentList.html#API_reader_GetMediaForFragmentList_ResponseSyntax. Чтобы получить изображение, вам просто нужно получить ключевой кадр в этом фрагменте и преобразовать его в изображение.

...