我正在尝试通过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的管道,则此事件永远不会被提升。
答案 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停止/启动他的管道,并立即知道要设置的大写字母。