Поэтому в моем проекте мне нужно захватить видеопоток, декодировать видео, запустить отдельные кадры с помощью алгоритма обнаружения объекта и затем воспроизвести вывод в виде видео.
Вся эта операция выполняется на сервере Linux с парой Tesla V100, 40-ядерным процессором (точная модель пока не может вспомнить) и смехотворным объемом оперативной памяти. Он должен воспроизводить видео с разрешением 720x576i со скоростью 25 кадр / с (прогрессивное), поэтому деинтерлейсинг также должен происходить на лету.
Само собой разумеется, что обнаружение объекта является самой медленной операцией, происходящей здесь, но в настоящее время я смотрю, как лучше подходить к транскодированию.
Теперь, поскольку у меня есть доступ к такому мощному графическому процессору, я подумал, что было бы разумно использовать его, но я также читал в нескольких местах, что транскодирование на GPU отстой.
В любом случае у меня установлена cuda 9.0, поэтому я собрал ffmpeg со следующими включенными параметрами:
--enable-libavcodec --enable-libx264 --enable-gpl --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp
(Я на 95% уверен, что это все, но если это действительно важно, проверьте, как только у меня будет доступ к серверу, который должен быть через пару дней)
Какой лучший способ продолжить отсюда? Я не очень знаком с ffmpeg и тем более, когда дело касается всех опций, связанных с gpu.
Я попытался деинтерлейсинг с -vf: yadif_cuda
, но это не удалось, сказав, что этот фильтр недоступен. Я думал, что это будет доступно, если я включил CUDA в опциях сборки.
Я понятия не имею, какие параметры использовать при декодировании (например, -hwaccel
???, -c:v libx264
или h264_cuvid
и т.д.), А также я не уверен, как следует отображать кадры, когда алгоритм обнаружения их выплевывает из. Я просто «играю» их? Перекодировать ли я, и если да, то как?
Любая помощь очень ценится, и, если понадобится дополнительная информация, я с радостью предоставлю то, что могу.
Я сделал диаграмму, чтобы уточнить, как все это должно закончиться:
Python используется для алгоритма, возможно, со сквидо для захвата и воспроизведения. Я мог бы также просто использовать ffmpeg напрямую (с командой bash, выполняемой из скрипта python), хотя при необходимости.
Все, что находится между Capture и Play, должно происходить вживую, то есть во время передачи видео конечному пользователю.