Python направляет поток ffmpeg в numpy в реальном времени - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь получить кадры из потока rtp через ffmpeg в реальном времени в python. На моем сервере кадры передаются по конвейеру из массивов numpy в ffmpeg и должны быть у клиента переданы обратно в numpy для дальнейшей обработки. Сервер создает файл sdp, который передается клиенту в качестве входных данных. Это выглядит так:

v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 58.42.102
m=video 5004 RTP/AVP 96
b=AS:19000
a=rtpmap:96 H265/90000

С ffplay или VL C поток может быть получен, но с моим кодом python нет, сначала нужно ок. 5se c для каждого кадра, а изображение представляет собой просто несколько случайных цветных пикселей. Клиент:

dimension = '{}x{}'.format(480, 240)
sdf_file = "video.sdp"

command = ['FFMPEG',
           '-protocol_whitelist', 'udp,rtp,file,pipe,crypto,data',
           '-i', sdf_file,
           '-pix_fmt', 'bgr24',
           '-r', '24',
           '-video_size', dimension,
           '-f', 'image2pipe', '-']

size = 480 * 240 * 3
proc = sp.Popen(command, stdout=sp.PIPE)

while True:
    try:
        tic = time.perf_counter()
        frame = proc.stdout.read(size)
        print(frame)
        if frame is None:
            print('no input')
            break
        image = np.frombuffer(frame, dtype='uint8').reshape(240, 480, 3)
        toc = time.perf_counter()
        print(f"performed calc in {(toc - tic) * 1000:0.4f} miliseconds")
        cv2.imshow('received', image)
    except Exception as e:
        print(e)

cv2.destroyAllWindows()
proc.stdin.close()
proc.wait()

Есть идеи, как я могу получить кадры в реальном времени? Спасибо за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...