Как декодировать видео (файл памяти / байтовая строка) и пошагово проходить по нему в python? - PullRequest
0 голосов
/ 06 марта 2020

Я использую python, чтобы выполнить некоторую базовую c обработку изображения, и хочу расширить его для обработки видео кадр за кадром.

Я получаю видео в виде большого двоичного объекта с сервера -. закодированы в webm - и имеют python в виде байтовой строки (b'\x1aE\xdf\xa3\xa3B\x86\x81\x01B\xf7\x81\x01B\xf2\x81\x04B\xf3\x81\x08B\x82\x88matroskaB\x87\x81\x04B\x85\x81\x02\x18S\x80g\x01\xff\xff\xff\xff\xff\xff\xff\x15I\xa9f\x99*\xd7\xb1\x83\x0fB@M\x80\x86ChromeWA\x86Chrome\x16T\xaek\xad\xae\xab\xd7\x81\x01s\xc5\x87\x04\xe8\xfc\x16\t^\x8c\x83\x81\x01\x86\x8fV_MPEG4/ISO/AVC\xe0\x88\xb0\x82\x02\x80\xba\x82\x01\xe0\x1fC\xb6u\x01\xff\xff\xff\xff\xff\xff ...).

Я знаю, что есть cv.VideoCapture, который может сделать почти то, что мне нужно. Проблема в том, что мне сначала нужно записать файл на диск, а затем загрузить его снова. Кажется, намного чище обернуть строку, например, в IOStream, и передать ее какой-либо функции, которая выполняет декодирование.

Есть ли чистый способ сделать это в python или запись на диск и снова загрузите его до go?

1 Ответ

1 голос
/ 07 марта 2020

Согласно этой записи, вы не можете использовать 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   -------------

Вот код:

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