Надеюсь, кто-нибудь может мне помочь. Я пытаюсь применить нейронную сеть (YOLOv2) для обнаружения объектов в потоке RTP, который я смоделировал в локальном режиме с использованием VL C, с отметкой «using RTP over TCP» как true. Поток 4K, 30 кадров в секунду, 15 Мбит / с. Я использую модуль ввода / вывода OpenCV C API для чтения кадров из потока.
Я использую общий код. Я открываю RTP следующим образом: cap = cvCaptureFromFile(url);
И затем выполняю захват в одном потоке, например: IplImage* src = cvQueryFrame(cap);
, а в другом потоке - часть обнаружения.
Я знаю, что OpenCV использует ffmpeg для захвата видео. Я использую ffmpeg 3.3.2. Моя проблема в том, что когда я получаю поток, появляется много артефактов. Вывод, который я получаю:
top block unavailable for requested intra mode -1
[h264 @ 0000016ae36f0a40] error while decoding MB 40 0, bytestream 81024
[h264 @ 0000016ae32f3860] top block unavailable for requested intra mode
[h264 @ 0000016ae32f3860] error while decoding MB 48 0, bytestream 102909
[h264 @ 0000016ae35e9e60] Reference 3 >= 3
[h264 @ 0000016ae35e9e60] error while decoding MB 79 0, bytestream 27231
[h264 @ 0000016a7033eb40] mmco: unref short failure
[h264 @ 0000016ae473ee00] Reference 3 >= 3
снова и снова, и слишком много потерь пакетов, которые я не вижу при отображении принятых кадров. Однако со мной не случается, когда я передаю по RTP другие видео низкого качества, такие как HD, со скоростью 30 кадров в секунду или тому подобное. Также верно, что 4K имеет много движения (это гонки Moto GP).
Я пытался: - Уменьшить частоту кадров при потоковой передаче. - Уменьшить битрейт - ffplay либо не показывает правильно входные кадры, но VL C показывает (не знаю почему). - Принудительная передача по TCP. - Принудительный ввод fps делает cvSetCaptureProperty(cap, CV_CAP_PROP_FPS, 1);
Почему это происходит и как я могу улучшить потери пакетов? Есть ли способ или что-то еще, что я могу попробовать?
Большое спасибо