Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Boto3 Kinesis Video GetMedia and OpenCV

I'm trying to use Boto3 to get a video stream from kinesis and then use OpenCV to display the feed and save it to a file at the same time.

The process of getting the signed URL and then the Getmedia request seems to work perfectly it's just when I'm trying to render it using OpenCV it doesn't seem to work.

Data is defiantly going to the stream

import boto3
import numpy as np
import cv2

kinesis_client = boto3.client('kinesisvideo',
                              region_name='eu-west-1',
                              aws_access_key_id='ACC',
                              aws_secret_access_key='KEY'
                              )

response = kinesis_client.get_data_endpoint(
    StreamARN='ARN',
    APIName='GET_MEDIA'
)
video_client = boto3.client('kinesis-video-media',
                            endpoint_url=response['DataEndpoint']
                            )
stream = video_client.get_media(
    StreamARN='ARN',
    StartSelector={'StartSelectorType': 'NOW'}
)
# print(stream)


datafeed = stream['Payload'].read()
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(True):
        ret, frame = stream['Payload'].read()


        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        else:
            break
cap.release()
out.release()
cv2.destroyAllWindows()
like image 314
Matthew Gialelis Avatar asked Apr 27 '18 11:04

Matthew Gialelis


1 Answers

To finally answer this I found a basic solution using the HLS Output available form kineses video streams. Which became available JUL 2018

Blog post: https://aws.amazon.com/blogs/aws/amazon-kinesis-video-streams-adds-support-for-hls-output-streams/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+AmazonWebServicesBlog+%28Amazon+Web+Services+Blog%29

Ive pasted the working version of my code below.

Im using AWS ENV varables for the BOTO3 authtication.

import boto3
import cv2

STREAM_NAME = "test-stream"
kvs = boto3.client("kinesisvideo")
# Grab the endpoint from GetDataEndpoint
endpoint = kvs.get_data_endpoint(
    APIName="GET_HLS_STREAMING_SESSION_URL",
    StreamName=STREAM_NAME
)['DataEndpoint']

print(endpoint)

# # Grab the HLS Stream URL from the endpoint
kvam = boto3.client("kinesis-video-archived-media", endpoint_url=endpoint)
url = kvam.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")
like image 115
Matthew Gialelis Avatar answered Nov 11 '22 15:11

Matthew Gialelis