【问题标题】:Using Python to parse and render Kinesis Video Streams and get an image representation of the input frame使用 Python 解析和呈现 Kinesis Video Streams 并获取输入帧的图像表示
【发布时间】:2020-12-07 05:38:13
【问题描述】:

我设置了一个管道,在其中我将视频实时流式传输到 Kinesis Video Stream (KVS),后者将帧发送到 Amazon Rekognition 进行人脸识别,进而将它们发送到 Kinesis Data Stream (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 的键作为响应。

我一直在尝试以某种方式将此有效负载渲染成图像。

但是,我每次都没有这样做,因为我不知道如何理解这个有效载荷并对其进行解码。

下面是代码sn-p。

    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 中的解决方案。

如果我的问题陈述有误或没有意义,请随时向我询问有关此问题的更多信息。

感谢您的帮助。 :)

【问题讨论】:

    标签: python amazon-web-services parsing amazon-kinesis payload


    【解决方案1】:

    使用以下代码收到payload后,

    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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 嗨@chehefen,感谢您的帮助。称为“帧”的密钥是否存在于同一有效负载中?您还可以通过告诉您如何从有效负载中提取帧来提供帮助吗?抱歉后续问题。我一直试图弄清楚它有一段时间了,但没有成功。谢谢:)
        【解决方案4】:

        可以使用以下代码sn-p。此外,您可以使用.read() 方法修改您在一轮中获取的数据以进行进一步优化。然后你可以根据你的要求视频fname。

        client = boto3.client('kinesis-video-media', endpoint_url=dataEndPoint)
        response = client.get_media(
                            StreamARN=streamARN,
                            StartSelector={
                                    'StartSelectorType': 'FRAGMENT_NUMBER',
                                    'AfterFragmentNumber': fragmentID}
                            )
        fname = '/tmp/'+fragmentID+'-'+serverTimestamp+'.webm'
        with open(fname, 'wb+') as f:
            chunk = response['Payload'].read(1024*8)
            while chunk:
                f.write(chunk)
                chunk = response['Payload'].read(1024*8)
        return fname
        

        【讨论】:

        • 为什么是 1024*8?
        猜你喜欢
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 2020-07-14
        • 1970-01-01
        相关资源
        最近更新 更多