Согласно этой записи, вы не можете использовать cv.VideoCapture
для декодирования в потоке памяти.
вы можете декодировать поток, "обрезая" до FFmpeg .
Решение немного сложное, и запись на диск намного проще и, вероятно, более чистое решение.
Я отправляю решение с использованием FFmpeg (и FFprobe).
Для FFmpeg существует Python привязок, но решение выполняет FFmpeg как внешнее приложение с использованием модуля subprocess .
(Привязка Python хорошо работает с FFmpeg, но нет связи с FFprobe).
Я использую Windows 10, и я помещаю ffmpeg.exe
и ffprobe.exe
в папку выполнения (вы может также указать путь выполнения).
Для Windows загрузите последнюю (статически понравившуюся) стабильную версию.
Я создал автономный пример, который выполняет следующее:
- Генерирует синтезированное c видео и сохраняет его в файле WebM (используется в качестве входных данных для тестирования).
- Чтение файла в память в виде двоичных данных (замените его с большого двоичного объекта с сервера).
- Передайте двоичный поток в FFprobe, чтобы найти разрешение видео.
Если разрешение известно заранее, вы можете пропустить эту часть.
Передача в FFprobe делает решение более сложным, чем оно. должен иметь. - Передать двоичный поток в FFmpeg
stdin
для декодирования и считывать декодированные необработанные кадры из stdout
pipe.
Запись в stdin
выполняется фрагментами с использованием потока Python.
(Причина использования stdin
и stdout
вместо именованных каналов для совместимости Windows).
Архитектура трубопровода:
-------------------- Encoded --------- Decoded ------------
| Input WebM encoded | data | ffmpeg | raw frames | reshape to |
| stream (VP9 codec) | ----------> | process | ----------> | numpy array|
-------------------- stdin PIPE --------- stdout PIP -------------
Вот код: