Проблемы с функцией тайм-аута для элемента `udpsrc` в GStreamer - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь смоделировать задержку при потоковой передаче 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 мс?

Подводя итог наблюдениям:

  1. тайм-аут вызывается, когда iMX6 полностью прекращает отправку пакетов udp, т.е. когда я выхожу из конвейера, используя ctrl + c на стороне imx6.

  2. тайм-аут не вызывается, когда iMX6 отправляет отложенные пакеты udp.

Мои дальнейшие тесты будут включать потери пакетов, задержки, объединенное дрожание, и в таком случае, когда нет пакетов, полученных каждые 100ms или некоторые X ms, я хочу обратный вызовбыть призванным.

У кого-нибудь есть указатели по этому вопросу?

...