我有一个流式传输到 Amazon Kinesis Video Streams 的 RTSP 流。我希望能够在流的每一帧上运行自定义图像处理。我有用python编写的自定义图像处理算法,所以我自然希望能够用python拉取KVS,并将其输入到图像处理算法中。首先,我尝试按照这篇文章的建议制作一个只显示 KVS 流的 python 应用程序(但是这篇文章使用 Amazon Rekognition 进行自定义处理,我的用例(自定义 python 处理)略有不同)。
我的问题是:
为什么我的 HLS python KVS 播放器卡顿/断断续续(随机暂停,然后很快播放过去几秒钟)?但是,此处可用的 HLS 流媒体看起来相当不错。
您如何有效地提取 Amazon Kinesis Video Stream 以进行自定义 python 处理?使用 HLS 与 Amazon 的 GetMedia API 的优缺点是什么?
- 我还研究了使用 Amazon 的 GetMedia API,发现这篇文章有人尝试使用 GetMedia,但最终选择了 HLS。
- 我发现使用 GetMedia 进行自定义处理的方法在此处 (python)和此处 (c++)进行了说明。
值得为此使用 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()