首页 > 解决方案 > 如何从基于 Python 的 Lambda 函数读取和处理 Kinesis Video Stream Signaling Chanel?

问题描述

前端使用 KVS WebRTC Front SDK 将视频流发送到 Kinesis Video Stream Signaling Chanel。

我正在尝试从 AWS 中基于 Python 的 Lambda 读取实时流。测试代码如下:

kinesis_client = boto3.client('kinesisvideo')

def lambda_handler(event, context):
    # # TODO implement
    # print(os.listdir('/opt'))
    # print(os.listdir('/opt/bin'))
    # print(cv2.__version__)
    # print(boto3.__version__)
    # print(botocore.__version__)
    
    response = kinesis_client.get_signaling_channel_endpoint(
        ChannelARN=channel_arn,
        SingleMasterChannelEndpointConfiguration={
            'Protocols': [
                # 'WSS',
                'HTTPS',
            ],
            'Role': role
        }
    )
    
    for endpoint in response['ResourceEndpointList']:
        channel_endpoint = endpoint['ResourceEndpoint']
        
    list_streams_response = kinesis_client.list_streams(
        MaxResults=123,
        # NextToken='string',
        # StreamNameCondition={
        #     'ComparisonOperator': 'BEGINS_WITH',
        #     'ComparisonValue': 'string'
        # }
    )
        
    stream_info_list = list_streams_response['StreamInfoList']
    for stream in stream_info_list:
        stream_name = stream['StreamName']
        stream_arn = stream['StreamARN']
        stream_key_id = stream['KmsKeyId']
        stream_version = stream['Version']
    
    # Grab the endpoint from GetDataEndpoint
    endpoint = kinesis_client.get_data_endpoint(
        # APIName="GET_MEDIA",
        # APIName="GET_HLS_STREAMING_SESSION_URL",
        APIName="GET_MEDIA_FOR_FRAGMENT_LIST",
        StreamName=stream_name
    )['DataEndpoint']
    print(endpoint)
    
    # # Grab the HLS Stream URL from the endpoint
    kvam = boto3.client("kinesis-video-archived-media", endpoint_url=endpoint)
    
    fragments = kvam.list_fragments(
        # StreamName=stream_name,
        StreamARN=stream_arn,
        MaxResults=123,
        # NextToken='string',
        # FragmentSelector={
        #     'FragmentSelectorType': 'PRODUCER_TIMESTAMP',
        #     'TimestampRange': {
        #         'StartTimestamp': datetime(2021, 7, 18),
        #         'EndTimestamp': datetime(2021, 7, 18)
        #     }
        # }
    )
    print(fragments)    
    url = kvam.get_hls_streaming_session_url(
        StreamName=stream_name,
        PlaybackMode="LIVE"
    )['HLSStreamingSessionURL']
    print(url)
    
    video_client = boto3.client('kinesis-video-media',
                            endpoint_url=endpoint
                            )
    stream = video_client.get_media(
        StreamARN=stream_arn,
        StartSelector={'StartSelectorType': 'NOW'}
    )
    # print(stream)
    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")

但是无法读取和处理。我的问题是

是否可以通过通道读取和处理 webrtc 流?或者只有当前端通过 Kinesis 视频流而不是通道发送视频流时才有可能?否则什么是固定代码?

先感谢您。

标签: pythonvideolambdastream

解决方案


推荐阅读