您如何有效地提取 Amazon Kinesis Video Stream 以进行自定义 python 处理?

How can you effectively pull an Amazon Kinesis Video Stream for custom python processing?

我有一个流式传输到 Amazon Kinesis Video Streams 的 RTSP 流。我希望能够 运行 对流的每一帧进行自定义图像处理。我有python写的自定义图像处理算法,自然希望能用python拉KVS,输入图像处理算法。首先,我尝试制作一个 python 应用程序,该应用程序仅按照 的建议显示 KVS 流(但是这个 post 使用 Amazon Rekognition 进行自定义处理,我的用例(自定义python 处理)略有不同)。

我的问题是:

  1. 为什么我的 HLS python KVS 播放器延迟/断断续续(随机暂停,然后很快播放过去的几秒)?然而,HLS 流光 available here 看起来相当不错。

  2. 如何有效地提取 Amazon Kinesis Video Stream 以进行自定义 python 处理? pros/cons 使用 HLS 与 Amazon 的 GetMedia API 有何不同?

    • 我还研究了使用 Amazon 的 GetMedia API,发现 this post 有人尝试使用 GetMedia 但最后却使用了 HLS。
    • 我找到了使用 GetMedia 进行自定义处理的方法 explained here (python) and here (c++)
  3. 是否值得为此使用 Sagemaker?对于我的图像处理,我只想进行推理,我不需要训练网络,它已经训练好了。

kvs_player.py的代码:

import boto3
import cv2

STREAM_NAME = "ExampleStream"
STREAM_ARN = "MY_STREAM_ARN"
AWS_REGION = 'us-east-1'


def hls_stream():

    kv_client = boto3.client("kinesisvideo", region_name=AWS_REGION)
    endpoint = kv_client.get_data_endpoint(
        StreamName=STREAM_NAME,
        APIName="GET_HLS_STREAMING_SESSION_URL"
    )['DataEndpoint']

    print(endpoint)

    # # Grab the HLS Stream URL from the endpoint
    kvam_client = boto3.client("kinesis-video-archived-media", endpoint_url=endpoint, region_name=AWS_REGION)
    url = kvam_client.get_hls_streaming_session_url(
        StreamName=STREAM_NAME,
        PlaybackMode="LIVE"
    )['HLSStreamingSessionURL']

    vcap = cv2.VideoCapture(url)

    while(True):
        # Capture frame-by-frame
        ret, frame = vcap.read()

        if frame is not None:
            # Display the resulting frame
            cv2.imshow('frame', frame)

            # Press q to close the video windows before it ends if you want
            if cv2.waitKey(22) & 0xFF == ord('q'):
                break
        else:
            print("Frame is None")
            break

    # When everything done, release the capture
    vcap.release()
    cv2.destroyAllWindows()
    print("Video stop")

if __name__ == '__main__':
    hls_stream()

一些通用的答案

  1. 您可能想要对您的应用程序进行一些调试以了解“滞后”的含义。可能只是网络延迟、传输错误或性能问题 运行 宁解码、python 处理和稍后 re-encoding。
  2. GetMedia 是一个快速 API 并且可以使用 Parser 库 https://github.com/aws/amazon-kinesis-video-streams-parser-library 进行 real-time 解析。您可能需要解码两个数量级以上的视频流 CPU 和 IO 密集型操作,因此您可能希望使用一些硬件加速解码器(或者至少是一个基于软件的良好解码器,它利用了 SIMD/SSE2指令集)。 JCodec 肯定不是那个。
  3. 这真的取决于你的应用程序。无论如何,在真正的 Sagemaker 运行 之前,您需要检索片段、解析和解码它们。有一个 KVS Sagemaker KIT 示例,您可以将其用于更严肃的推理应用程序。

对于范围更广、针对性更强的问题,您可以直接转到 GitHub 页面,找到相关的 project/asset 问题,并删除一个问题,包括详细描述和详细日志。