首页 > 解决方案 > 如何从 android 设备摄像头直播以将视频块存储在 Amazon S3 存储桶上?

问题描述

我正在开发一个围绕视频录制和分析的 Android 解决方案项目。这个想法是,由于视频会很大,所以我必须设计一个解决方案,其中说每 30 分钟(可以从 1 分钟到 30 分钟不等),我的代码应该选择一个缩减的视频文件并上传到云,从设备中删除该部分,同时摄像头继续监视和捕获视频源。例如,一旦我在上午 8:00 开始流式传输或录制并使用 1 分钟的间隔,存储在 S3 存储桶上的视频文件应该具有如下数据:

第一个视频文件 - 从上午 8:00 到上午 8:01

第二个视频文件 - 从上午 8:01 到上午 8:02

……

依此类推,直到流停止。

目前,我正在使用来自https://github.com/awslabs/aws-sdk-android-samples的 AmazonKinesisVideoDemoApp 。

我使用 Kinesis Video Streams 作为媒介,我可以开始从我的 android 设备流式传输到 kinesis,并在 python 中使用 GET_HLS_STREAMING_SESSION_URL API 从流中获取视频并存储在 s3 存储桶中。

def save_chunks_to_s3(init_time, time_range):

    timestamp = datetime.strptime(init_time, "%Y%m%d_%H%M%S")

    while True:

        playback_url = kvam.get_hls_streaming_session_url(StreamName=STREAM_NAME, PlaybackMode='ON_DEMAND', 
            HLSFragmentSelector={
            'FragmentSelectorType': 'SERVER_TIMESTAMP',
            'TimestampRange': {
                'StartTimestamp': timestamp,
                'EndTimestamp': timestamp + timedelta(seconds=time_range)
                }
            }
        )['HLSStreamingSessionURL']

        vcap = cv2.VideoCapture(playback_url)

        fwidth = int(vcap.get(cv2.CAP_PROP_FRAME_WIDTH)) 
        fheight = int(vcap.get(cv2.CAP_PROP_FRAME_HEIGHT))

        length = int(vcap.get(cv2.CAP_PROP_FRAME_COUNT))

        current_time = timestamp.strftime("%Y%m%d_%H%M%S")
        filename = 'output_'+current_time+'.avi'

        print("Saving to file "+filename)

        fourcc = cv2.VideoWriter_fourcc(*'MJPG')
        out = cv2.VideoWriter(filename,fourcc, 20.0, (fwidth,fheight))

        (grabbed, frame) = vcap.read()

        if grabbed:
            # Capturing all the frames
            while(length>0):
                if frame is not None:
                    out.write(frame)
                length -= 1
                (grabbed, frame) = vcap.read()

            out.release()
            vcap.release()

            # Storing to s3 bucket
            with open(filename, 'rb') as data:
                s3.upload_fileobj(data, 'android-kinesis-video-chunks', 'android_stream_'+filename)


            print("Saved to file "+filename)

            timestamp = timestamp + timedelta(seconds=time_range)

        else:
            out.release()
            vcap.release()
            break



s3 = boto3.client("s3")

kvs = boto3.client("kinesisvideo")

response = kvs.get_data_endpoint(APIName="GET_HLS_STREAMING_SESSION_URL", StreamName=STREAM_NAME)

# Grab the endpoint from GetDataEndpoint
endpoint = response['DataEndpoint']

# Grab the HLS Stream URL from the endpoint
kvam = boto3.client("kinesis-video-archived-media", 
        endpoint_url=endpoint, 
        region_name=REGION_NAME, 
        aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY)

while True:
    try:
        # This will throw ResourceNotFoundException if not streaming
        live_url = kvam.get_hls_streaming_session_url(StreamName=STREAM_NAME, PlaybackMode="LIVE")['HLSStreamingSessionURL']
        init_utc_time = datetime.utcnow().strftime("%Y%m%d_%H%M%S")

        start_time = time.time()

        # Storing will start after a delay of 90s after live stream started
        while(time.time()-start_time<90):
            print(time.time()-start_time)

        # Using interval range of 1 minute
        save_chunks_to_s3(init_utc_time, 60)


    except:
        print("Waiting for live stream......")

在 android 设备上启动视频流之前,我在本地机器上运行上述代码。但是要求是要么使用一些无服务器解决方案运行它,要么找到一些其他将视频直接流式传输到 S3 的解决方案。

标签: androidamazon-web-servicesamazon-s3

解决方案


推荐阅读