захват видео с V4l2 потерял / потерял кадры - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть научное c приложение, которое захватывает видеопоток video4 Linux. Очень важно, чтобы мы захватили каждый кадр, и никто не потерялся. К сожалению, кадры отсутствуют здесь и там, и я не знаю, почему.

Чтобы определить пропущенные кадры, я сравниваю порядковый номер v4l2_buffer с моим собственным счетчиком сразу после чтения кадра:

void detectDroppedFrame(v4l2_buffer* buffer) {
        _frameCounter++;

        auto isLastFrame = buffer->sequence == 0 && _frameCounter > 1;
        if (!isLastFrame && _frameCounter != buffer->sequence+1)
        {
                std::cout << "\n####### WARNING! Missing frame detected!" << std::endl;               
                _frameCounter = buffer->sequence+1; // re-sync our counter with correct frame number from driver.
        }
}

Мой пример с одним файлом из 1 файла можно найти на github (на основе официального примера захвата V4L2): https://gist.github.com/SebastianMartens/7d63f8300a0bcf0c7072a674b3ea4817

Протестировано с веб-камерой на виртуальной машине Ubuntu 18.04 на оборудовании ноутбука (uvcvideo драйвер), а также с камерой CSI на нашем встроенном оборудовании, работающем под управлением Ubuntu 18.04. Кадры не обрабатываются, и буферы, кажется, захватываются достаточно быстро (состояние буфера проверяется с помощью VIDIOC_QUERYBUF, который показывает, что все буферы находятся во входящей очереди драйвера и флаг V4L2_BUF_FLAG_DONE не установлен). Я потерял кадры с MMAP, а также с методом UserPtr. Также кажется, что он не зависит от формата пикселя, размера изображения и частоты кадров!

Мне кажется, что драйвер camera / v4l2 не может заполнить доступные буферы достаточно быстро, но также увеличивает приоритет дескриптора файла с помощью команды VIDIOC_S_PRIORITY не помогает (все еще может быть проблема планирования потоков?).

=> Каковы возможные причины, по которым V4L2 не пересылает кадры (не помещает их в свою исходящую очередь)? => Правильный ли мой метод обнаружения потерянных кадров? Есть ли другие варианты или инструменты для этого?

...