GStreamer中元素udpsrc的超时功能问题

时间:2018-10-05 11:22:50

标签: udp gstreamer imx6 python-gstreamer

我正在尝试使用linux工具模拟UDP流中的延迟- netem。我的想法是模拟网络延迟,数据包丢失等,因为该应用程序将通过WiFi使用。

我使用以下命令来引起1000ms的延迟(在iMX6服务器端):

tc qdisc add dev eth0 root netem delay 1000ms 

现在,当我在通过LAN连接的2台设备之间ping时,观察到此延迟 电缆。我的设备是iMX6(服务器)和Ubuntu PC(客户端)

我正在将视频数据包从iMX6传输到已配置的PC iMX6的eth0端口的1000ms延迟。

gst-launch-1.0 -v imxv4l2videosrc device=/dev/video1 ! imxvpuenc_h264 
bitrate=500  ! h264parse ! rtph264pay ! udpsink host=192.168.1.11 port=xxxx 

在Ubuntu PC上: 我为udp源配置了10ms的超时时间:

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向PC传输视频数据时,在PC渲染的视频中观察到1000ms的延迟,并且渲染的视频是连续的。当我完全停止从iMX6发送数据包时,可以看到发生了超时并调用了回调。

因此,在根本没有数据包的情况下,而不是在接收数据包有延迟的情况下,称为超时。 我期望延迟接收数据包时每个100ms都会收到通知,即imx6板仅每个1000ms发送视频数据包,正如上面命令中使用netem配置的那样

我知道现在UDP上有连续的数据包流,因此超时功能可能无法正常工作。 有没有一种方法可以使UDP源工作,而不是每100毫秒接收一次数据包?

总结观察结果:

  1. 当iMX6完全停止发送udp数据包时,即当我在imx6一侧使用ctrl + c退出管道时,将调用超时。

  2. 当iMX6发送延迟的udp数据包时,不会调用超时。

我的进一步测试将包括数据包丢失,延迟,抖动等,在这种情况下,每隔100ms或某些X ms都没有接收到数据包,我希望调用回调函数。

有人在这个问题上有什么建议吗?

0 个答案:

没有答案