Linux 当udpsink管道在udpsrc管道之前运行时,Gstreamer 1.0无视频

Linux 当udpsink管道在udpsrc管道之前运行时,Gstreamer 1.0无视频,linux,gstreamer,h.264,rtp,Linux,Gstreamer,H.264,Rtp,我正在尝试通过udpsink将网络摄像头源从计算机a传输到计算机B。如果计算机A的管道在计算机B通过udpsrc启动其接收管道之前将数据发送到计算机B,则使用vaapisink、xvimagesink或ximagesink不会显示数据。如果计算机B在任何数据流传输到它之前启动了他的管道,我可以很好地显示计算机A的视频提要 以下是我从命令行使用的管道: 计算机A: sudo gst-launch-1.0 -v v4l2src device=/dev/video0 do-timestamp=true

我正在尝试通过udpsink将网络摄像头源从计算机a传输到计算机B。如果计算机A的管道在计算机B通过udpsrc启动其接收管道之前将数据发送到计算机B,则使用vaapisink、xvimagesink或ximagesink不会显示数据。如果计算机B在任何数据流传输到它之前启动了他的管道,我可以很好地显示计算机A的视频提要

以下是我从命令行使用的管道: 计算机A:

sudo gst-launch-1.0 -v v4l2src device=/dev/video0 do-timestamp=true ! \
"video/x-raw, format=I420, width=640, height=480, framerate=30/1" ! \
vaapiencode_h264 ! rtph264pay ! udpsink host=192.168.0.31 port=5400
计算机B:

sudo gst-launch-1.0 -v udpsrc port=5400 ! "application/x-rtp, payload=96, \
encoding-name=H264" ! rtph264depay ! vaapiparse_h264 ! vaapidecode ! \
videoconvert ! xvimagesink sync=false async=false
当我在计算机B上使用GST_DEBUG=4时,我看不到任何错误。通过调试输出我看到的是,当计算机B在A之前启动管道时,计算机B从GST_EVENT_new_caps接收到一个新的GST_事件,然后处理计算机A的流。但是,如果计算机A的流已经流到计算机B,而B的管道尚未初始化,则不会引发此事件。

分辨率: 在计算机A的管道中的“rtph264pay”中添加“config interval=1”(我相信另一个间隔量也可以-除了0以外的任何值)以读取:

sudo gst-launch-1.0 -v v4l2src device=/dev/video0 do-timestamp=true ! \
"video/x-raw, format=I420, width=640, height=480, framerate=30/1" ! \
vaapiencode_h264 ! rtph264pay config-interval=1 ! udpsink host=192.168.0.31 port=5400
下面是我通过将GST_DEBUG=4添加到计算机A和B得到的结果

当计算机A启动其管道时,默认情况下似乎只调用一次新的GST_事件来设置新的上限。如果计算机B没有运行其管道,在UDP端口上侦听数据,它将不会检测到任何新的GST_事件,这些事件告诉计算机B要设置什么上限

这解释了为什么如果计算机B的管道比计算机A的管道运行得早,这些管道就工作了;计算机B将捕获计算机A的GST_事件,告诉计算机B要设置的上限类型

当config interval设置为大于0时,计算机A的流似乎可以继续引发GST_事件,让计算机B停止/启动其管道,并立即知道要设置哪些上限