Я пытаюсь смоделировать задержку при потоковой передаче UDP с помощью инструмента linux - netem .Моя идея - симулировать задержку в сети, потерю пакетов и т. Д., Поскольку приложение будет использоваться через WiFi.
Я использую следующую команду, чтобы вызвать задержку 1000ms
(на стороне сервера iMX6):
tc qdisc add dev eth0 root netem delay 1000ms
Теперь эта задержка наблюдается, когда я пингую между двумя устройствами, подключенными черезLAN кабель.Мои устройства iMX6 (сервер) и Ubuntu PC (клиент)
Я передаю видеопакеты с iMX6 на ПК, где я настроил задержку 1000ms
для порта eth0 iMX6.
gst-launch-1.0 -v imxv4l2videosrc device=/dev/video1 ! imxvpuenc_h264
bitrate=500 ! h264parse ! rtph264pay ! udpsink host=192.168.1.11 port=xxxx
На ПК с Ubuntu: я настроил таймаут 10ms
для источника udp:
udpsrc port = xxxx timeout=10000000 ! rtph264depay ! h264parse ! avdec_h264
! autovideosink
Я устанавливаю обратный вызов сообщения на шине для элемента udpsrc
,это вызывает обратный вызов при обнаружении сообщения об истечении времени ожидания.Псевдокод (Python-GStreamer) выглядит следующим образом:
bus = self.pipeline.get_bus()
bus.connect('message::element',self.on_timeout)
def on_timeout(self,bus,msg)
strct = msg.get_structure()
if strct.has_name("GstUDPSrcTimeout"):
print("udp source timeout detected")
Когда я передаю видеоданные по UDP с iMX6 на ПК, я наблюдаю задержку 1000ms
в видео, отображаемом на ПК, и в отображаемом видеоявляется непрерывнымКогда я полностью прекращаю отправку пакетов из iMX6, я вижу, что происходит тайм-аут и вызывается обратный вызов.
Таким образом, тайм-аут вызывается, когда нет пакетов вообще, а не когда есть задержка в получении пакетов.Я ожидал получать уведомление каждые 100ms
, когда пакеты принимаются с задержкой, т.е. плата imx6 передает видеопакеты только каждые 1000ms
, как это было настроено в приведенной выше команде с использованием netem
Я понимаю, что сейчас в UDP существует непрерывный поток пакетов, и поэтому, возможно, функция тайм-аута не работает.Есть ли способ заставить работать источник UDP, чтобы не получать пакеты каждые 100 мс?
Подводя итог наблюдениям:
тайм-аут вызывается, когда iMX6 полностью прекращает отправку пакетов udp, т.е. когда я выхожу из конвейера, используя ctrl + c на стороне imx6.
тайм-аут не вызывается, когда iMX6 отправляет отложенные пакеты udp.
Мои дальнейшие тесты будут включать потери пакетов, задержки, объединенное дрожание, и в таком случае, когда нет пакетов, полученных каждые 100ms
или некоторые X ms
, я хочу обратный вызовбыть призванным.
У кого-нибудь есть указатели по этому вопросу?