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

问题描述

我有一个RTSP流流到Amazon Kinesis Video Streams。我希望能够在流的每个帧上运行自定义图像处理。我有用python编写的自定义图像处理算法,因此自然而然地我希望能够使用python拉出KVS,并将其输入到图像处理算法中。首先,我尝试通过遵循this post的建议,制作一个显示KVS流的python应用程序(但是,本文将Amazon Rekognition用于自定义处理,但是我的用例(自定义python处理)略有不同)。

我的问题是:

  1. 我的HLS python KVS播放器为何显得迟钝/断断续续(偶尔暂停,然后很快播放过去几秒钟)?但是,HLS拖缆available here看起来还不错。

  2. 如何有效地提取Amazon Kinesis Video Stream进行自定义python处理?使用HLS与Amazon的GetMedia API的利弊是什么?

  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处理以及稍后重新编码时出现的性能问题。
  2. GetMedia是一种快速的API,解析器库https://github.com/aws/amazon-kinesis-video-streams-parser-library可用于进行实时解析。您可能需要对视频流进行解码,这比CPU和IO密集型操作多两个数量级,因此您可能需要使用一些硬件加速解码器(或至少使用SIMD / SSE2指令集的基于软件的良好解码器)。 JCodec当然不是一个。
  3. 这实际上取决于您的应用程序。无论如何,在实际运行Sagemaker之前,您需要检索片段,解析和解码它们。有一个KVS Sagemaker KIT示例可用于更严格的推理应用。

对于范围更广,针对性更强的问题,您可以直接转至GitHub页面以获取适当的项目/资产,并剪切包括详细说明和详细日志的问题。