Python: кодировать видео в файл / буфер (НЕ имя файла) - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть поток изображений, я хочу записать их в файлоподобный объект (интерфейс с .read() и .write()). Я хочу код c - сжатие кадров изображения. Контекст таков: я хочу иметь возможность использовать свой собственный транспорт и повысить производительность отправки видеопотоков между процессами машинного обучения в контейнерах. Может быть gRP C, может быть веб-сокеты, в любом случае, я хочу получить доступ к байтам, сгенерированным кодом c после подачи его кадров, и не нужно беспокоиться о передаче по трубопроводу во внешний процесс gStreamer / ffmpeg, потому что это лишнее накладные расходы.

Это должно работать:

import cv2
from io import BytesIO

fourcc = cv2.VideoWriter_fourcc(*'h264')
buf = BytesIO()
out = cv2.VideoWriter(buf, fourcc, 30, (h, w))

Или это

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
f = s.makefile()
out = cv2.VideoWriter(f, fourcc, 30, (h, w))

, но дает крипт c TypeError: must be real number, not tuple, потому что он пытается быть "умным" с выводом аргументов, основанных на их типе .

Нет проблем с mkfifo:

out = cv2.VideoWriter('/tmp/myfifo', fourcc, 30, (h, w)) # works!

Таким образом, openCV может писать в абстрактный файл. Я бы скорее не использовал gStreamer, а я мог бы использовать fifo, но на самом деле мне нужен либо сокет, либо поток байтов, который я могу отправить в свой собственный транспорт. Я тоже не заперт в openCV.

...