我想从AWS Kinesis捕获视频流并使用asyncio
。我的目标是从流中提取帧并将其传递到处理队列。
下面是我到目前为止所拥有的有效示例。它接收不同长度的数据块(可能在76字节的范围内,最多8192个),这似乎并不是一个完整的帧。
是否有一种便宜的方法可以在支持asyncio的情况下(最好是没有线程)将流拆分为多个块?
我希望一个应用程序至少处理10-20个流,并在服务器上每个CPU运行一个应用程序。
我当时在考虑ffmpeg
和opencv
,但它们似乎太笨重,似乎与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
与其他解决方案结合使用来满足上述要求。
答案 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/ 它可用于按比例处理视频流。