我想从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
和另一种解决方案来满足上述要求。
它必须是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/它可以用来按比例处理视频流。