Kinesis视频流异步获取帧

时间:2019-02-27 16:49:10

标签: python python-asyncio video-processing amazon-kinesis

我想从AWS Kinesis捕获视频流并使用asyncio。我的目标是从流中提取帧并将其传递到处理队列。

下面是我到目前为止所拥有的有效示例。它接收不同长度的数据块(可能在76字节的范围内,最多8192个),这似乎并不是一个完整的帧。

是否有一种便宜的方法可以在支持asyncio的情况下(最好是没有线程)将流拆分为多个块?

我希望一个应用程序至少处理10-20个流,并在服务器上每个CPU运行一个应用程序。

我当时在考虑ffmpegopencv,但它们似乎太笨重,似乎与asyncio兼容不好。

import asyncio

import aiobotocore

VIDEO_STREAM_NAME = 'bc-test1'


async def get_data2(loop):
    chunk_size = 1024 * 1024 * 500
    session = aiobotocore.get_session(loop=loop)
    async with session.create_client('kinesisvideo', region_name='us-west-2', ) as client:
        resp = await client.get_data_endpoint(
            StreamName=VIDEO_STREAM_NAME,
            APIName='GET_MEDIA',
        )
        data_url = resp['DataEndpoint']

    async with session.create_client('kinesis-video-media', endpoint_url=data_url) as client:
        resp = await client.get_media(
            StreamName=VIDEO_STREAM_NAME,
            StartSelector={"StartSelectorType": "NOW", },
        )
        print(resp)
        while True:
            data = await resp['Payload'].read(1024 * 8)
            if data:
                print("frame len: %s" % len(frame))
            else:
                print("No data")
                break


def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(get_data2(loop))


if __name__ == '__main__':
    main()

我认为建议不要将asyncio与其他解决方案结合使用来满足上述要求。

1 个答案:

答案 0 :(得分:0)

必须是python吗?

KinesisVideoStream在Java中具有使用流,解析数据和解码视频的示例:https://github.com/aws/amazon-kinesis-video-streams-parser-library

KinesisVideoStream还具有KIT:https://aws.amazon.com/blogs/machine-learning/analyze-live-video-at-scale-in-real-time-using-amazon-kinesis-video-streams-and-amazon-sagemaker/ 它可用于按比例处理视频流。