Я пытаюсь использовать свой нос в качестве указывающего устройства. План состоит в том, чтобы закодировать видеопоток с веб-камеры, направленной мне в лицо, как 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 сделать это.