Как извлечь векторы движения из h264 без полного декодирования на CPU - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь использовать свой нос в качестве указывающего устройства. План состоит в том, чтобы закодировать видеопоток с веб-камеры, направленной мне в лицо, как h264 или что-то подобное, получить векторы движения, немного обработать числа и забросить их в / dev / uinput, чтобы указатель мыши двигался. Бит uinput был простым.

Это должно работать с нулевой заметной задержкой. Это, например:

#!/bin/bash
[ -p pipe.mkv ] || mkfifo pipe.mkv
ffmpeg -y -rtbufsize 1M -s 640x360 -vcodec mjpeg -i /dev/video0 -c h264_nvenc pipe.mkv &
ffplay -flags2 +export_mvs -vf codecview=mv=pf+bf+bb pipe.mkv

показывает, что векторы есть, но с задержкой в ​​несколько секунд, что невозможно использовать в мыши. Я знаю, что первый шаг ffmpeg работает очень быстро с использованием графического процессора, поэтому либо канал, либо декодирование h264 на втором шаге представляют задержку.

Я попробовал MV Tractus (так же, как mpegflow, я думаю) в подобном расположении труб, и это было очень медленно. Они выполняют полное декодирование h264 на процессоре, и я думаю, что это проблема, потому что я вижу, что они создают большую нагрузку на один процессор. Если бы канал вызвал задержку из-за плохой буферизации, то ЦП не был бы загружен. Я полагаю, что ffplay также выполнял декодирование на процессоре, и я не мог убедить его не делать этого, но он только хочет рисовать стрелки, которые мне не нужны.

Я думаю, что есть несколько подходов, и я ' Мне нужен совет, что было бы лучше всего, или есть что-то еще лучшее, о чем я не знаю. Я мог:

  • Аппаратно декодировать и получать векторы движения. Пока это не удалось. Я попытался объединить образцы extract_mvs.c и hw_decode.c ffmpeg, но векторы движения не появились. vdpau - единственный декодер, который я использовал на своем linux боксе. У меня nvidia gpu.
  • Сделайте минимальный синтаксический анализ h264, чтобы вывести sh только векторы движения, игнорируя все остальные данные. Я думаю, это будет означать включение какой-то опции "только движение" в синтаксический анализатор libav, но я совсем не знаком с этим кодом.
  • Найдите другую библиотеку синтаксического анализа h264, которая имеет эту опцию, а также распаковывает контейнер.
  • Забудьте об аппаратном ускорении кодирования и используйте урезанный кодировщик, чтобы создавать только векторы движения на CPU или GPU. Я подозреваю, что это будет медленно, потому что я считаю, что вычисление векторов движения - самая сложная часть алгоритма.

Я склоняюсь ко второму варианту, но мне нужна помощь, чтобы выяснить, где в коде libav сделать это.

...