如果 rtph265pay 在 rtph265depay 之前启动,GStreamer rtph265pay/rtph265depay 不工作

GStreamer rtph265pay/rtph265depay does not work if rtph265pay started before rtph265depay

给定两个 GStreamer 管道:

发件人:

gst-launch-1.0 videotestsrc do-timestamp=true pattern=snow ! video/x-raw,width=640,height=480,framerate=30/1 ! x265enc ! h265parse ! rtph265pay ! udpsink host=127.0.0.1 port=5801

接收者

gst-launch-1.0 -v udpsrc port=5801 ! application/x-rtp,encoding-name=H265 ! rtph265depay ! decodebin ! autovideosink sync=false

如果我先启动 Receiver,管道工作正常。如果我先启动 Sender,接收管道实际上不会开始显示任何输出。它确实将以下内容打印到终端:

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = application/x-rtp, encoding-name=(string)H265, media=(string)video, clock-rate=(int)90000
/GstPipeline:pipeline0/GstRtpH265Depay:rtph265depay0.GstPad:sink: caps = application/x-rtp, encoding-name=(string)H265, media=(string)video, clock-rate=(int)90000

知道为什么会这样吗?我假设在流的开头发送了某种形式的“开始”数据包,接收器需要为此“唤醒”,但这纯粹是基于直觉,而不是任何文档。

我找到了解决方案,如果我阅读 rtph265pay 的文档,我就会找到它。 https://gstreamer.freedesktop.org/documentation/rtp/rtph265pay.html?gi-language=c

有一个名为config-interval的参数,它是“发送VPS,SPS和PPS插入间隔秒”。此参数最初为 0,这意味着它可能只在流的开头发送它,而不会再次发送。将此值设置为正数使接收方能够在每次发送此数据时开始读取流。对于我的应用程序,值 1s 效果很好。