Я хотел бы захватить видеопоток из AWS Kinesis и использовать asyncio
.Моя цель - извлечь кадры из потока и передать их в очередь обработки.
Ниже приведен рабочий пример того, что у меня есть.Он получает фрагменты данных различной длины (например, в диапазоне от 76 байт до 8192), которые не являются полным кадром.
Существует ли дешевый способ разделения потока на фрагментыс поддержкой asyncio и предпочтительно без потоков?
Я хочу, чтобы одно приложение обрабатывало не менее 10-20 потоков и чтобы на сервере работало одно приложение на каждый процессор.
Я думал о 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
с другим решением для удовлетворениятребования выше.