使用Python解析和渲染运动视频流,并获得输入帧的图像表示

2024-09-28 05:17:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经建立了一个管道,在这个管道中,我将视频实时传输到Kinesis视频流(KVS),该视频流将帧发送到Amazon Rekognition进行人脸识别,然后再发送到Kinesis数据流(KDS)。最后,KDS将结果发送给lambda

对于已进行人脸识别的帧,我得到以下格式的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中的一个解决方案

如果我的问题陈述是错误的或没有意义,请随时问我更多关于这个问题的问题

谢谢你的帮助。:)


Tags: https图像clientawsjsondocsfor管道
3条回答

来自GetMedia的响应是MKV打包格式的流。首先,您需要使用一些Python库从MKV格式(https://github.com/vi/mkvparse或类似格式)提取帧。接下来,您的流可能会被编码。例如H264。如果您需要的话,您还需要解码帧以获得图像的实际位图。似乎很少有可用于Python的基于软件的解码器:https://github.com/DaWelter/h264decoder

不过,我对这些项目并不熟悉

您得到的负载是MKV格式的:https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_reader_GetMediaForFragmentList.html#API_reader_GetMediaForFragmentList_ResponseSyntax。要获得图像,只需在片段中获得关键帧并将其转换为图像

使用以下代码接收有效载荷后

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文件并将此帧写入其中,然后使用openCV从此mvi文件中提取特定帧

with open('/tmp/stream.avi', 'wb') as f:
                f.write(frame)
                cap = cv2.VideoCapture(file.mvi)
                #use frame for further processing

相关问题 更多 >

    热门问题