簡體   English   中英

使用 Python 解析和渲染 Kinesis Video Streams 並獲取輸入幀的圖像表示

[英]Using Python to parse and render Kinesis Video Streams and get an image representation of the input frame

我已經設置了一個管道,我將視頻 stream 直播到 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的鍵作為響應。

我一直在嘗試以某種方式將此有效載荷渲染成圖像。

然而,我每次都沒有這樣做,因為我不知道如何理解這個有效載荷並對其進行解碼。

以下是代碼片段。

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

如果我的問題陳述有誤或沒有意義,請隨時向我詢問有關此問題的更多信息。

謝謝您的幫助。 :)

GetMedia 的響應是 MKV 打包格式的流。 首先,您需要使用一些從 MKV 格式( https://github.com/vi/mkvparse或類似格式)中提取幀的 Python 庫。 接下來,您的流很可能會被編碼。 例如 H264。 如果您需要,您還需要解碼幀以獲得圖像的實際位圖。 似乎很少有基於軟件的解碼器可用於 Python: https : //github.com/DaWelter/h264decoder

雖然我不熟悉這些項目。

使用以下代碼接收有效負載后,

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

您獲得的有效負載采用 MKV 格式: https : //docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_reader_GetMediaForFragmentList.html#API_reader_GetMediaForFragmentList_ResponseSyntax 要獲取圖像,您只需要獲取該片段中的關鍵幀並將其轉換為圖像。

可以使用以下代碼片段。 此外,您可以使用.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

請參閱此 AWS 代碼示例存儲庫:

https://github.com/aws-samples/amazon-kinesis-video-streams-consumer-library-for-python

這會將 Kinesis Video GetMedia 塊解析為 MKV 片段和單個幀,如 JPEG/PNG 或 NDArray 的純 python。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM