У меня есть поток изображений, я хочу записать их в файлоподобный объект (интерфейс с .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.