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

时间:2014-08-27 15:17:55

标签: linux gstreamer h.264 rtp

我正在尝试通过udpsink将网络摄像头Feed从计算机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_EVENT,然后处理计算机A的流。但是,如果计算机A的流已经流式传输到计算机B而没有初始化B的管道,则此事件永远不会被提升。

1 个答案:

答案 0 :(得分:1)

分辨率: 添加" config-interval = 1" (我确定另一个间隔金额可以很好 - 除了0之外的任何东西)到" rtph264pay"在计算机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 config-interval=1 ! udpsink host=192.168.0.31 port=5400

这是我通过向计算机A和B添加GST_DEBUG = 4而发现的。

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

这就解释了如果计算机B的管道在计算机A之前运行,这些管道的工作原理;计算机B会抓住计算机A的GST_EVENT告诉计算机B要设置的上限类型。

如果config-interval设置为大于0的值,则计算机A的流可以继续提升GST_EVENT,让计算机B停止/启动他的管道,并立即知道要设置的大写字母。