1

我有一个流式传输到 Amazon Kinesis Video Streams 的 RTSP 流。我希望能够在流的每一帧上运行自定义图像处理。我有用python编写的自定义图像处理算法,所以我自然希望能够用python拉取KVS,并将其输入到图像处理算法中。首先,我尝试按照这篇文章的建议制作一个只显示 KVS 流的 python 应用程序但是这篇文章使用 Amazon Rekognition 进行自定义处理,我的用例(自定义 python 处理)略有不同)。

我的问题是:

  1. 为什么我的 HLS python KVS 播放器卡顿/断断续续(随机暂停,然后很快播放过去几秒钟)?但是,此处可用的 HLS 流媒体看起来相当不错。

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

    • 我还研究了使用 Amazon 的 GetMedia API,发现这篇文章有人尝试使用 GetMedia,但最终选择了 HLS。
    • 我发现使用 GetMedia 进行自定义处理的方法在此处 (python)此处 (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()

4

1 回答 1

1

一些通用的答案

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

对于范围更广和更有针对性的问题,您可以直接转到相关项目/资产的 GitHub 页面,并删除包括详细描述和详细日志在内的问题。

于 2020-11-08T07:14:03.403 回答